比较两个文件,如果匹配,只有最后两个字段将下移(awk)
我有两个输入文件(以制表符分隔),如果只匹配第3和第4个字段将下移,我需要为$1&&$2查找它们之间的匹配: 输入: 文件1: 文件2: 输出:比较两个文件,如果匹配,只有最后两个字段将下移(awk),awk,compare,Awk,Compare,我有两个输入文件(以制表符分隔),如果只匹配第3和第4个字段将下移,我需要为$1&&$2查找它们之间的匹配: 输入: 文件1: 文件2: 输出: 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' file
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}' ?
中的
操作符将告诉您是否在file1中看到file2中的$1$2
值。这比检查c[$1$2]>0
有一个优势,因为后者实际上会为$1$2
创建一个条目,即使它以前不存在(其值相当于0
,因此仍然有效,但我们不需要在中使用来创建它来避免这种副作用)
编辑:在数组索引中使用逗号分隔符,以便在$1
和$2
之间插入子集值,从而避免注释中正确指出的问题
$ 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
中的操作符将告诉您是否在file1中看到file2中的$1$2
值。这比检查c[$1$2]>0
有一个优势,因为后者实际上会为$1$2
创建一个条目,即使它以前不存在(其值相当于0
,因此仍然有效,但我们不需要在中使用来创建它来避免这种副作用)
编辑:在数组索引中使用逗号分隔符,以便在$1
和$2
之间插入子集值,从而避免注释中正确指出的问题
$ 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
中的操作符将告诉您是否在file1中看到file2中的$1$2
值。这比检查c[$1$2]>0
有一个优势,因为后者实际上会为$1$2
创建一个条目,即使它以前不存在(其值相当于0
,因此仍然有效,但我们不需要在中使用来创建它来避免这种副作用)
编辑:在数组索引中使用逗号分隔符,以便在$1
和$2
之间插入子集值,从而避免注释中正确指出的问题
$ 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
中的操作符将告诉您是否在file1中看到file2中的$1$2
值。这比检查c[$1$2]>0
有一个优势,因为后者实际上会为$1$2
创建一个条目,即使它以前不存在(其值相当于0
,因此仍然有效,但我们不需要在中使用来创建它来避免这种副作用)
编辑:在数组索引中使用逗号分隔符,以便在$1
和$2
之间插入子集值,从而避免注释中正确指出的问题
$ 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
试试这一行:
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
kent$head f1 f2
==>f1 f2试试这一行:
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
kent$head f1 f2
==>f1 f2试试这一行:
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
kent$head f1 f2
==>f1 f2试试这一行:
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
kent$head f1 f2
==>f1 f2a[$1$2]
不安全。想想p112
和p112
。谢谢,@Kent,yikes,完全正确。编辑为使用子页面
a[$1$2]
不安全。想想p112
和p112
。谢谢,@Kent,yikes,完全正确。编辑为使用子页面
a[$1$2]
不安全。想想p112
和p112
。谢谢,@Kent,yikes,完全正确。编辑为使用子页面
a[$1$2]
不安全。想想p112
和p112
。谢谢,@Kent,yikes,完全正确。编辑为使用子页面
。如果我还有其他问题(希望问题简单…)。如果我想向下移动,则只向下移动第3列和第4列,第1列和第2列将位于同一位置(从结果中的第二个文件开始)。那么p1\t323\tlololo\taaaa\np1\t555\np1\t556\tpapapp\tkkka也将如此吗?感谢you@fedulka也许你可以问一个新问题?评论中所需的文本格式无法阅读…我添加了它..我不想重复类似的问题,但是的,你是对的..如果我有其他问题(我希望问题简单..)。如果我想向下移动,则只向下移动第3列和第4列,第1列和第2列将位于同一位置(从结果中的第二个文件开始)。那么p1\t323\tlololo\taaaa\np1\t555\np1\t556\tpapapp\tkkka也将如此吗?感谢you@fedulka也许你可以问一个新问题?评论中所需的文本格式无法阅读…我添加了它..我不想重复类似的问题,但是的,你是对的..如果我有其他问题(我希望问题简单..)。如果我想向下移动,则只向下移动第3列和第4列,第1列和第2列将位于同一位置(从结果中的第二个文件开始)。那么p1\t323\tlololo\taaaa\np1\t555\np1\t556\tpapapp\tkkka也将如此吗?感谢you@fedulka也许你可以问一个新问题?评论中所需的文本格式无法阅读…我添加了它..我不想重复类似的问题,但是的,你是对的..如果我有其他问题(我希望问题简单..)。如果我想向下移动,则只向下移动第3列和第4列,第1列和第2列将位于同一位置(从结果中的第二个文件开始)。那么p1\t323\tlololo\taaaa\np1\t555\np1\t556\tpapapp\tkkka也将如此吗?感谢you@fedulka也许你可以问一个新问题?评论中所需的文本格式无法读取…我添加了它..我不想重复类似的问题,但是的,你是对的。。