加入两个都有重复行的文件
Joining two files that both have duplicate rows
我正在尝试连接两个具有相同列 1 和不同列 2 的文件:
文件 1
aaa 1
bbb 3
bbb 3
ccc 1
ccc 1
ccc 0
文件 2
aaa 2
bbb 2
bbb 2
ccc 1
ccc 1
ccc 0
当我尝试加入他们时
join File1 File2 > File3
我明白了
aaa 1 2
bbb 3 2
bbb 3 2
bbb 3 2
bbb 3 2
ccc 1 1
ccc 1 1
ccc 1 0
ccc 1 1
ccc 1 1
ccc 1 0
ccc 0 1
ccc 0 1
ccc 0 0
join
正在尝试扩展重复项,而我想要它做的只是逐行进行,因此输出应该是
aaa 1 2
bbb 3 2
bbb 3 2
ccc 1 1
ccc 1 1
ccc 0 0
如何告诉 join
忽略重复项并逐行合并文件?
编辑:这是在一个循环中完成的,多个文件都具有相同的第 1 列但不同的第 2 列。我将前两个文件连接到一个临时文件中,然后循环遍历与该文件连接的其他文件临时文件。
根据@Andre Wildberg 的建议,这个效果最好:
paste File1 <(cut -d " " -f 2 File2)
这允许循环遍历文件列表:
cat File1 > tmp
for file in $files
do
paste tmp <(cut -d " " -f 2 $file) > tmpf
mv tmpf tmp
done
mv tmp FinalFile
假设:
- 所有文件的行数相同
- 所有文件在同一编号行的第一列中具有相同的值
- 最终结果集可以放入内存
示例输入:
$ for f in f{1..4}
do
echo "############ $f"
cat $f
done
############ f1
aaa 1
bbb 3
bbb 3
ccc 1
ccc 1
ccc 0
############ f2
aaa 2
bbb 2
bbb 2
ccc 1
ccc 1
ccc 0
############ f3
aaa 12
bbb 12
bbb 12
ccc 11
ccc 11
ccc 10
############ f4
aaa 202
bbb 202
bbb 202
ccc 201
ccc 201
ccc 200
一个awk
想法:
awk '
FNR==NR { a[FNR]=[=11=]; next }
{ a[FNR]=a[FNR] OFS }
END { for (i=1;i<=FNR;i++)
print a[i]
}
' f1 f2 f3 f4
这会生成:
aaa 1 2 12 202
bbb 3 2 12 202
bbb 3 2 12 202
ccc 1 1 11 201
ccc 1 1 11 201
ccc 0 0 10 200
我正在尝试连接两个具有相同列 1 和不同列 2 的文件:
文件 1
aaa 1
bbb 3
bbb 3
ccc 1
ccc 1
ccc 0
文件 2
aaa 2
bbb 2
bbb 2
ccc 1
ccc 1
ccc 0
当我尝试加入他们时
join File1 File2 > File3
我明白了
aaa 1 2
bbb 3 2
bbb 3 2
bbb 3 2
bbb 3 2
ccc 1 1
ccc 1 1
ccc 1 0
ccc 1 1
ccc 1 1
ccc 1 0
ccc 0 1
ccc 0 1
ccc 0 0
join
正在尝试扩展重复项,而我想要它做的只是逐行进行,因此输出应该是
aaa 1 2
bbb 3 2
bbb 3 2
ccc 1 1
ccc 1 1
ccc 0 0
如何告诉 join
忽略重复项并逐行合并文件?
编辑:这是在一个循环中完成的,多个文件都具有相同的第 1 列但不同的第 2 列。我将前两个文件连接到一个临时文件中,然后循环遍历与该文件连接的其他文件临时文件。
根据@Andre Wildberg 的建议,这个效果最好:
paste File1 <(cut -d " " -f 2 File2)
这允许循环遍历文件列表:
cat File1 > tmp
for file in $files
do
paste tmp <(cut -d " " -f 2 $file) > tmpf
mv tmpf tmp
done
mv tmp FinalFile
假设:
- 所有文件的行数相同
- 所有文件在同一编号行的第一列中具有相同的值
- 最终结果集可以放入内存
示例输入:
$ for f in f{1..4}
do
echo "############ $f"
cat $f
done
############ f1
aaa 1
bbb 3
bbb 3
ccc 1
ccc 1
ccc 0
############ f2
aaa 2
bbb 2
bbb 2
ccc 1
ccc 1
ccc 0
############ f3
aaa 12
bbb 12
bbb 12
ccc 11
ccc 11
ccc 10
############ f4
aaa 202
bbb 202
bbb 202
ccc 201
ccc 201
ccc 200
一个awk
想法:
awk '
FNR==NR { a[FNR]=[=11=]; next }
{ a[FNR]=a[FNR] OFS }
END { for (i=1;i<=FNR;i++)
print a[i]
}
' f1 f2 f3 f4
这会生成:
aaa 1 2 12 202
bbb 3 2 12 202
bbb 3 2 12 202
ccc 1 1 11 201
ccc 1 1 11 201
ccc 0 0 10 200