2017-02-21 15 views
1

Как я могу объединить все поля каждой строки из обоих файлов после сопоставления по ключевому полю? Как обобщить этот однострочный слой, если количество полей неизвестно в f2?Как распечатать все столбцы после сопоставления по ключевому полю

f2:  
a 1 2  
b 3 4  
c 5 6 

f3:  
10 a x y z  
11 g x y z  
12 j x y z  

observed:  
a 10 x y z 
a1 10 x y z 

Desired:  
a 1 2 10 x y z 

Это мои лучшие попытки, но неверны:

AWK «FNR == NR {а [$ 1] = $ 2; следующий} ($ 2 в) {напечатать [$ 2], $ 0} 'f2.txt f3.txt> f4.txt

awk' FNR == NR {a [$ 1] = $ 2 $ 3; next} ($ 2 in a) {напечатать [$ 2], $ 0} 'f2 .txt f3.txt> f4.txt

ответ

0
awk 'NR==FNR{a[$1]=$0;next} ($2 in a){print a[$2],$1,$3,$4,$5}' f2.txt f3.txt > f4.txt 

сохранить в целом в качестве значения и column1 как ключ, когда прочитал 2-й файл, проверьте column2 в массиве a или нет, если да, то печать a[$2], а остальные столбцы

Более короткий путь (недостаток этой команды есть один дополнительное пространство между 10 и х):

awk 'NR==FNR{a[$1]=$0;next} ($2 in a){second=$2; $2="";print a[second],$0}' f2.txt f3.txt > f4.txt 

заменить $ 2 из 2 файла с пустой строкой, и распечатать всю линию $0

0

@ mxttgen31: попробуйте:

awk 'FNR==NR{Q=$2;$2="";A[Q]=$0;next} ($1 in A){print $0,A[$1]}' f3 f2 

Объяснение выше команды следующим образом:

awk 'FNR==NR{  ##### Checking condition FNR==NR here, where FNR and NR both denotes the number of line, 
         only difference between FNR and NR is as we could read mutiple files from awk, 
         value of FNR will be RESET on next file's start, where NR's value will be keep on increasing till 
         it completes reading all the file. so this condition will be TRUE only when first Input_file(which is f3 here) will be TRUE. 
Q=$2;    ##### Assigning second field's value to variable Q. 
$2="";    ##### making second field's value to NULL now. 
A[$2]=$0;   ##### Create an array named A whose index is $2 and value is current line. 
next}    ##### putting next(awk's in-built keyword) which skips all next further statements and take the cursor again to starting. 
($1 in A)   ##### Cursor will come here whenever second Input_file is being read, so here checking $1(first field) is present in array A then do following. 
{print $0,A[$1]} ##### print the current line($0) of current file named f2 and print array A's value whose index is $1 of current file f2. 
' f3 f2   ##### Mentioning Input_files here. 
+1

ваш выход '1 2 а 10 xyz', желаемый выход OP равен 'a 1 2 10 xyz ' – haifzhan

+0

Спасибо TON Haifeng Zhang, я отредактировал его сейчас. – RavinderSingh13

0

если файлы сортируются в ключах, как в вашем примере, join является инструментом для решения этой задачи

join -11 -22 f2.txt f3,txt