我希望将前两列作为键,将两个文件逐行合并为一个文件。例如:
FILE1.TXT
a b c 1 4 7
x y z 2 5 8
p q r 3 6 9
FILE2.TXT
p q r 11
a b c 12
x y z 13
我对上述两个文件的所需输出是:
a b c 1 4 7 12
x y z 2 5 8 13
p q r 3 6 9 11
每个文件中的列数不固定,可能因行而异。另外,我在每个文件中都有超过27K行。
他们没有订购。他们唯一的问题是两个文件的前三个字段是相同的。
答案 0 :(得分:1)
您也可以使用join
,它需要排序输入并且前3个字段已合并。下面的示例对每个文件进行排序,并让sed
合并并分隔字段:
join <(sort file1.txt | sed 's/ /-/; s/ /-/') \
<(sort file2.txt | sed 's/ /-/; s/ /-/') |
sed 's/-/ /; s/-/ /'
输出:
a b c 1 4 7 12
p q r 3 6 9 11
x y z 2 5 8 13
答案 1 :(得分:1)
加入前三个字段,其中字段数为(四个或更多):
{
# get the forth field until the last
for (i=4;i<=NF;i++)
f=f$i" "
# concat fields
arr[$1OFS$2OFS$3]=arr[$1OFS$2OFS$3]f;
# reset field string
f=""
}
END {
for (key in arr)
print key, arr[key]
}
运行如:
$ awk -f script.awk file1 file2
a b c 1 4 7 12
p q r 3 6 9 11
x y z 2 5 8 13
答案 2 :(得分:0)
试试这个:
awk 'NR==FNR{a[$1$2$3]=$4;next}$1$2$3 in a{print $0, a[$1$2$3]}' file2 file1
答案 3 :(得分:0)
如果列的长度不同,您可以使用SUBSEP
尝试类似的内容:
awk 'NR==FNR{A[$1,$2,$3]=$4; next}($1,$2,$3) in A{print $0, A[$1,$2,$3]}' file2 file1
对于file1和sort输出中的不同列,请尝试:
awk '{$1=$1; i=$1 FS $2 FS $3 FS; sub(i,x)} NR==FNR{A[i]=$0; next}i in A{print i $0, A[i]}' file2 file1 | sort