我正在尝试将两个文件组合在一起(交集)
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 = $1 }
NR == 1 {header = key}
!(key in result) {result[key] = $0; 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
我只是注意到这是Union set。 包括所有数据Test1和Test2。
我想仅针对交叉口案例展示我期望的结果。 (1,2,3,4)仅
你们有什么想法吗?谢谢!
答案 0 :(得分:23)
使用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
答案 1 :(得分:5)
$ awk -v OFS='\t' '
NR==1 { print $0, "Remark1", "Remark2"; next }
NR==FNR { a[$1]=$0; next }
$1 in a { print a[$1], $2, $3 }
' 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
答案 2 :(得分:2)
另一个替代方案是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
标志,它将文件合并到列中。 t
标志会删除页眉和页脚 - 因为我们不打算在纸上打印,所以我们不需要它们。最后一个w
标志用于设置宽度。
答案 3 :(得分:1)
awk -F"\t" '
{key = $1 FS $2 FS $3 FS $4}
NR == 1 {header = key}
!(key in result) {result[key] = $0; 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