我有两个文件
cat test1.txt
1|2|3|4
2|3|4|4
3|4|5|5
cat test2.txt
1|2|4|5
2|3|5|6
3|5|7|7
我的输出应该是
1|2|3|4|4|5
2|3|4|4|5|6
就像在字段1和2上连接两个文件一样,从文件1中获取1,2,3,4的值,从文件2中获取3,4的值。
请帮帮我吗?
答案 0 :(得分:4)
awk -F\| 'NR == FNR {
f2[$1, $2] = $3 OFS $4
next
}
($1, $2) in f2 {
print $0, f2[$1, $2]
}' OFS=\| test2.txt test1.txt
答案 1 :(得分:2)
尝试在perl
paste -d '|' file1.txt file2.txt |
perl -F'\|' -lane '
print join "|", @F[0..3,6,7] if $F[0] eq $F[4] and $F[1] eq $F[5]
'
在sh
:
#!/bin/sh
paste -d '|' test1.txt test2.txt | while IFS='|' read a1 a2 a3 a4 a5 a6 a7 a8; do
if [ $a1 -eq $a5 -a $a2 -eq $a6 ]; then
echo "$a1|$a2|$a3|$a4|$a7|$a8"
fi
done
<强>输出强>
1|2|3|4|4|5
2|3|4|4|5|6
答案 2 :(得分:2)
嗯,这适用于你的例子:
sed 's/|/+/' t1.txt>$$.tmp;sed 's/|/+/' t2.txt|join -t \| -j 1 $$.tmp -|sed 's/+/|/';rm $$.tmp
答案 3 :(得分:2)
这似乎也有效:
$ sed 's/|/\t/2' 1.txt > 1_1.txt; sed 's/|/\t/2' 2.txt > 2_1.txt;
$ join -j1 1_1.txt 2_1.txt | tr ' ' '|'
$ rm 1_1.txt 2_1.txt
没有临时文件创建的单行程序(感谢@dbaupp):
$ join -j1 <(sed 's/|/\t/2' 1.txt) <(sed 's/|/\t/2' 2.txt) | tr ' ' '|'
答案 4 :(得分:0)
另一种解决方案:
awk -F "|" '{getline a < "file1"}NR==1{print a, $3, $4 "\n"}NR==3{print a, $3, $4}' OFS="|" file2
结果:
$ awk -F "|" '{getline a < "file1"}NR==1{print a, $3, $4 "\n"}NR==3{print a, $3, $4}' OFS="|" file2
1|2|3|4|4|5
2|3|4|4|5|6