簡體   English   中英

根據第一列將兩個文件合並為一個文件

[英]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不同。

您可以使用Alacon - Alasql數據庫的命令行實用程序來完成此操作。

它適用於Node.js,因此您需要安裝Node.js然后安裝Alasql包:

要從制表符分隔文件中連接兩個數據,可以使用以下命令:

> node alacon "SELECT * INTO TSV("main.txt") FROM TSV('data1.txt') data1 
                   JOIN TSV('data2.txt') data2 USING [0]"

這是一條很長的路線。 在此示例中,所有文件都包含“Sheet1”表中的數據。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM