Слияние текстовых файлов в csh с сохранением строк места

У меня есть около 100 текстовых файлов с двумя столбцами, которые я хотел бы объединить в один файл в сценарии оболочки c, используя фактор «A».

Например, у меня есть файл A, который выглядит так:
A B1
1 100
2 200
3 300
4 400

и Файл B выглядит следующим образом:
A B2
1 100
2 200
3 300
4 400
5 300
6 400

Я хочу, чтобы окончательный файл C выглядел так:
A B1 B2
1 100 100
2 200 200
3 300 300
4 400 400
5 300
6 400


Функция cat только помещает файлы друг на друга и вставляет их в файл C. Я хотел бы разместить данные рядом друг с другом. Это возможно?


person RHatesMe    schedule 23.01.2015    source источник


Ответы (1)


чтобы соответствовать вашей точной спецификации, это будет работать. Если спецификация изменится, вам нужно немного поиграть с этим,

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 означает NumberOfFfields в текущей строке, поэтому 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