awk - сравните 2 файла и распечатайте столбцы из обоих файлов

Я отправил что-то подобное только что, и я думал, предоставленный код мог помочь в решении моей проблемы, однако к сожалению, я не могу скорректировать его к своим потребностям: awk - сравнивают файлы и печатают строки из обоих файлов

Так, у меня есть снова 2 разделенных от вкладки файла.

file_1.txt

apple    2.5    5     7.2
great    3.8    10    3.6
see      7.6    3     4.9
tree     5.4    11    5
back     8.9    2     2.1

file_2.txt

apple    :::N
back     :::ADJ
back     :::N      
around   :::ADV      
great    :::ADJ         
bee      :::N         
see      :::V      
tree     :::N         

Вывод должен быть похожим:

apple    :::N      2.5    5     7.2     
great    :::ADJ    3.8    10    3.6
back     :::ADJ    8.9    2     2.1
back     :::N      8.9    2     2.1
see      :::V      7.6    3     4.9
tree     :::N      5.4    11    5 

Различие к другому сообщению, что я точно так же, как, чтобы сравнить первые столбцы file_1.txt и file_2.txt и затем распечатать целую строку file_1.txt со столбцом 2 file_1.txt к outfile. Я не забочусь, в котором порядок 2$ file_2.txt печатается к outfile, таким образом, outfile мог также быть похожим

back     8.9    2     2.1    :::N
back     8.9    2     2.1    :::V etc.

Проблемой являются дубликаты в column1 как назад здесь. Иначе я мог, конечно, просто использовать paste. Проблема с этой 'awk-командой, что она не читает column2 в массив и если я говорю ей печатать ее, это не возможно, конечно.

awk 'NR==FNR {a[$1]; next} $1 in a {print $0, a[$2]}' OFS='\t' file_2.txt file_1.txt > outfile.txt

Я с удовольствием ценю любую справку! Извините за глупость здесь также, кажется, что я полностью озадачен.

2
задан 12 June 2018 в 07:15

1 ответ

Если у Вас есть GNU awk (доступный из репозитория через пакет gawk), который поддерживает многомерные массивы, Вы могли сделать

gawk 'NR==FNR {a[$1][$2]++; next} $1 in a {for (x in a[$1]) print $0, x}' OFS="\t" file_2.txt file_1.txt

Напр.

$ gawk 'NR==FNR {a[$1][$2]++; next} $1 in a {for (x in a[$1]) print $0, x}' OFS="\t" file_2.txt file_1.txt
apple   2.5     5       7.2     :::N
great   3.8     10      3.6     :::ADJ
see     7.6     3       4.9     :::V
tree    5.4     11      5       :::N
back    8.9     2       2.1     :::ADJ
back    8.9     2       2.1     :::N

Иначе, если произведенный порядок не важен, самое легкое решение состоит в том, чтобы, вероятно, использовать join команда вместо этого:

$ join -t $'\t' <(sort file_1.txt) <(sort file_2.txt)
apple   2.5     5       7.2     :::N
back    8.9     2       2.1     :::ADJ
back    8.9     2       2.1     :::N
great   3.8     10      3.6     :::ADJ
see     7.6     3       4.9     :::V
tree    5.4     11      5       :::N
3
ответ дан 2 December 2019 в 02:47

Другие вопросы по тегам:

Похожие вопросы: