Linux объединяет два файла по столбцам
Я пытаюсь объединить два файла, как показано ниже (перекрестке)
ID Name Telephone
1 John 011
2 Sam 013
3 Jena 014
4 Peter 015
второй файл test2 на.txt
1 Test1 Test2
2 Test3 Test4
3 Test5 Test6
4 Test7 Test8
5 Test7 Test8
6 Test7 Test8
7 Test7 Test8
8 Test7 Test8
9 Test7 Test8
тогда окончательный результат
ID Name Telephone Remark1 Remark2
1 John 011 Test1 Test2
2 Sam 013 Test3 Test4
3 Jena 014 Test5 Test6
4 Peter 015 Test7 Test8
Я такой как ниже
awk -F"t" '
{key = }
NR == 1 {header = key}
!(key in result) {result[key] = ; next}
{ for (i=2; i <= NF; i++) result[key] = result[key] FS $i }
END {
print result[header]
delete result[header]
PROCINFO["sorted_in"] = "@ind_str_asc"
for (key in result) print result[key]
}
' Test1.txt Test2.txt > result.txt
и я просто замечаю, что это набор Союза. Включая все данные Test1 и Test2.
Я хотел бы показать только для случая пересечения, как то, что я ожидал результата. (1, 2 ,3 ,4) только
у вас есть какие-нибудь идеи? Спасибо!
4 ответов
$ awk -v OFS='\t' '
NR==1 { print , "Remark1", "Remark2"; next }
NR==FNR { a[]=; next }
in a { print a[], , }
' Test1.txt Test2.txt
ID Name Telephone Remark1 Remark2
1 John 011 Test1 Test2
2 Sam 013 Test3 Test4
3 Jena 014 Test5 Test6
4 Peter 015 Test7 Test8
гораздо проще использовать join
:
$ cat a.txt
ID Name Telephone
1 John 011
2 Sam 013
3 Jena 014
4 Peter 015
$ cat b.txt
ID Remark1 Remark2
1 Test1 Test2
2 Test3 Test4
3 Test5 Test6
4 Test7 Test8
5 Test7 Test8
6 Test7 Test8
7 Test7 Test8
8 Test7 Test8
9 Test7 Test8
$ join a.txt b.txt
ID Name Telephone Remark1 Remark2
1 John 011 Test1 Test2
2 Sam 013 Test3 Test4
3 Jena 014 Test5 Test6
4 Peter 015 Test7 Test8
использовать column
довольно распечатать его:
$ join a.txt b.txt | column -t
ID Name Telephone Remark1 Remark2
1 John 011 Test1 Test2
2 Sam 013 Test3 Test4
3 Jena 014 Test5 Test6
4 Peter 015 Test7 Test8
Другой альтернативой было pr
который используется для формирования файлов для печати.
$ pr -tm -w 50 Test1.txt Test2.txt
ID Name Telephone ID Remark1 Remark2
1 John 011 1 Test1 Test2
2 Sam 013 2 Test3 Test4
3 Jena 014 3 Test5 Test6
4 Peter 015 4 Test7 Test8
5 Test7 Test8
6 Test7 Test8
7 Test7 Test8
8 Test7 Test8
9 Test7 Test8
самое главное -m
флаг, который объединяет файлы в столбцы. The t
флаг удаляет верхние и нижние колонтитулы-поскольку мы не собираемся печатать на бумаге, они нам не нужны. Последний w
флаг для установки ширины.
awk -F"\t" '
{key = FS FS FS }
NR == 1 {header = key}
!(key in result) {result[key] = ; next}
{ for (i=5; i <= NF; i++) result[key] = result[key] FS $i }
END {
print result[header]
delete result[header]
PROCINFO["sorted_in"] = "@ind_str_asc" # if using GNU awk
for (key in result) print result[key]
}
' Test1.txt Test2.txt ... > result.txt