[英]Merging two files into one based on the first column
我有兩個文件,都是相同的格式 - 兩列都包含一個數字,例如:
檔案1
1.00 99
2.00 343
3.00 34
...
10.00 343
檔案2
1.00 0.4
2.00 0.5
3.00 0.34
...
10.00 0.9
我想生成以下文件(使用,awk,bash perl):
1.00 99 0.4
2.00 343 0.5
3.00 34 0.34
...
10.00 343 0.9
謝謝
join file1 file2
假設文件在連接字段中排序。 如果不是,您可以這樣做:
join <(sort -V file1) <(sort -V file2)
這是一個AWK版本( sort
補償了AWK的非確定性數組排序):
awk '{a[$1]=a[$1] FS $2} END {for (i in a) print i a[i]}' file1 file2 | sort -V
它似乎比Perl答案更短,更易讀。
在gawk
4中,您可以設置數組遍歷順序:
awk 'BEGIN {PROCINFO["sorted_in"] = "@ind_num_asc"} {a[$1]=a[$1] FS $2} END {for (i in a) print i a[i]}' file1 file2
而且您不必使用sort
實用程序。 @ind_num_asc
是Index Numeric Ascending。 請參閱使用gawk 控制陣列遍歷和陣列排序以及使用預定義陣列掃描順序 。
請注意,上面sort
命令中的-V
( - --version-sort
)需要來自coreutils 7.0或更高版本的GNU sort
。 感謝@simlev指出如果可用的話應該使用它。
Perl解決方案
perl -anE 'push @{$h{$F[0]}}, $F[1]; END{ say "$_\t$h{$_}->[0]\t$h{$_}->[1]" for sort{$a<=>$b} keys %h }' file_1 file_2 > file_3
好吧,看看awk-oneliner這比我的第一次嘗試短,它有更好的輸出然后awk-oneliner並且它不使用'管道排序-n':
perl -anE '$h{$F[0]}="$h{$F[0]}\t$F[1]"; END{say "$_$h{$_}" for sort {$a<=>$b} keys %h}' file_1 file_2
如果第一個文件的第二列中沒有值的條目,則單行表示與join-example不同。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.