добавить столбец из файла в другой, awk - PullRequest
1 голос
/ 05 марта 2020

Попытка использовать awk для добавления $1 в file к $2 в out, разделенных tab при сохранении строки заголовка в out. Последняя строка в file дублируется в out, и я не уверен, почему это так? Спасибо :).

файл

/path/to/00-0000-000-xx-yyy
/path/to/01-1212-1111-aa-bb

out tab-delimited

Header1 Header2 Header3
1
2

текущий tab-delimited

Header1 Header2 Header3 /path/to/00-0000-000-xx-yyy
1a1 /path/to/01-1212-1111-aa-bb
2a2 /path/to/01-1212-1111-aa-bb

желательно tab-delimited

Header1 Header2 Header3
1   /path/to/00-0000-000-xx-yyy
2   /path/to/01-1212-1111-aa-bb

awk

awk '{getline l < "file"; print $0"\t"l} ' FNR==1 out > tmp && mv tmp out

Ответы [ 2 ]

3 голосов
/ 05 марта 2020
$ awk 'NR==FNR{a[NR]=$1; next} FNR>1{$0=$0 "\t" a[FNR-1]} 1' file out
Header1 Header2 Header3
1       /path/to/00-0000-000-xx-yyy
2       /path/to/01-1212-1111-aa-bb

Последняя строка из file в вашем примере дублируется в out, потому что когда getline не удается из-за попытки прочитать 3-ю строку 2-строчного файла, он ничего не назначает l и т. Д. При печати l сохраняет последнее значение, для которого getline удалось. Прочитайте http://awk.freeshell.org/AllAboutGetline, если вы когда-нибудь задумываетесь снова использовать getline в будущем - это редко лучший подход, и когда вы его используете, вы должны использовать его очень конкретно c, как описано в статья для защиты от часто крипт c и тихих ошибок.

Кроме того, никогда не называйте переменную l, так как она слишком похожа на число 1 и поэтому запутывает ваш код.

2 голосов
/ 05 марта 2020

Не могли бы вы попробовать следующее.

awk 'BEGIN{OFS="\t"} FNR==NR{if(FNR==1){print;next}a[FNR-1]=$0;next} {print a[FNR],$0}' out file

ИЛИ форма решения, не относящаяся к одному вкладышу, выглядит следующим образом:

awk '
BEGIN{
  OFS="\t"
}
FNR==NR{
  if(FNR==1){
    print
    next
  }
  a[FNR-1]=$0
  next
}
{
  print a[FNR],$0
}' out file

Вывод будет следующим.

Header1 Header2 Header3
1   /path/to/00-0000-000-xx-yyy
2   /path/to/01-1212-1111-aa-bb
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...