我有两个输入文件(制表符分隔),我需要找到它们之间的$ 1&&如果仅匹配第3和第4个字段将向下移动,则$ 2:
INPUT:
p1 555
p1 557
p3 558
p1 323 lololo aaaa
p1 555 papapp kkka
p1 556 hooho sssa
p1 557 jjjlo kkka
p3 424 zzzzz llla
p3 558 jjjjj ssss
输出:
p1 323 lololo aaaa
p1 555
papaapp kkka
p1 556 hooho sssa
p1 557
jjjlo kkka
etc.
我有比较:
awk -F'\t' 'NR==FNR{c[$1$2]++;next};c[$1$2] > 0' file1 file2
但是如何为它做条件我不知道:
awk '{if ($1$2file1 == $1$2file2) print $1$2"\n"$3$4; else print $0}' ?
答案 0 :(得分:2)
试试这个单行:
awk -F'\t' 'NR==FNR{a[$0];next}
{k=$1 FS $2;if(k in a){print k;$1=$2=FS}print}' file1 file2
包含您的数据:
kent$ head f1 f2
==> f1 <==
p1 555
p1 557
p3 558
==> f2 <==
p1 323 lololo aaaa
p1 555 papapp kkka
p1 556 hooho sssa
p1 557 jjjlo kkka
p3 424 zzzzz llla
p3 558 jjjjj ssss
kent$ awk -F'\t' 'NR==FNR{a[$0];next}{k=$1 FS $2;if(k in a){print k;$1=$2=FS}print}' f1 f2
p1 323 lololo aaaa
p1 555
papapp kkka
p1 556 hooho sssa
p1 557
jjjlo kkka
p3 424 zzzzz llla
p3 558
jjjjj ssss
答案 1 :(得分:1)
in
运算符会告诉您是否在file1中看到了file2的$1$2
值。这比检查c[$1$2] > 0
更有优势,因为后者实际上会为$1$2
创建一个条目,即使它之前不存在(值相当于0
,所以仍然有效,但是我们不需要创建它就可以通过使用in
来避免副作用。
编辑:在数组索引中使用逗号分隔符,以便在$1
和$2
之间插入SUBSEP值,从而避免在评论中正确指出的问题
$ cat tf.awk
BEGIN {FS=OFS="\t"}
NR==FNR {c[$1,$2]; next}
{if (($1,$2) in c) print $1,$2 RS OFS OFS $3, $4; else print}
$ awk -f tf.awk file1 file2
p1 323 lololo aaaa
p1 555
papapp kkka
p1 556 hooho sssa
p1 557
jjjlo kkka
p3 424 zzzzz llla
p3 558
jjjjj ssss