чтобы соответствовать вашей точной спецификации, это будет работать. Если спецификация изменится, вам нужно немного поиграть с этим,
paste -d' ' factorA factorB \
| awk 'NF==4||NF==3{print $1, $2, $3} NF==2{print$1, $2}' \
> factorC
# note, no spaces or tabs after each of the contintuation chars `\` at end of lines!
вывод
$ cat factorC
A B1 B2
1 100 100
2 200 200
3 300 300
4 400 400
5 300
6 400
Не уверен, как вы получаете заголовки bold
для «передачи» через каналы unix. ;->
Напомним, что все awk
программы имеют базовую базовую структуру, т.е.
awk 'pattern{action}' file
Таким образом, pattern
может быть диапазоном строк, регулярным выражением, выражением (NF==4
), отсутствующим или чем-то еще.
action
— это то, что происходит при совпадении шаблона. Это выглядит более традиционно code
.
Если pattern
не указано, то action
применяется ко всем прочитанным строкам. Если action
не указано, но pattern
совпадает, то строка печатается (без лишних слов).
NF
означает N
umberOfF
fields в текущей строке, поэтому NF==2
будет обрабатывать только строку с 2 полями (конечные записи в factorB).
||
— это логический оператор OR
, поэтому этот блок будет обрабатывать только те записи, в которых число полей равно 3 OR 4
. Надеюсь, утверждения print
не требуют пояснений.
,
, разделяющий $1,$2,$3
(например), представляет собой синтаксис, который преобразуется во внутреннюю переменную awk OFS
, то есть OutputFieldSeparator
, которая может быть назначена как OFS="\t"
(для предоставления OFS символа табуляции), или, как в этом случае, мы не указываем значение, поэтому мы получаем значение по умолчанию для OFS, которое представляет собой пробел (" "
) (без кавычек!)
IHTH
person
shellter
schedule
23.01.2015