我有两个文件,一个包含NF=7
,另一个包含NF=47
$2
我需要检查文件中的出现次数NF=7
。如果计数为<=2
,那么我需要从包含以下内容的同一文件中创建一个数组arr1[$1]=$1
对于此操作,我使用了以下代码:
awk -F"," '{if(NF==7){arr[$2]++}}END{for(i in a){if(arr[i]<=2){print $0}}}'
对于第二个文件的操作,我需要将第一个文件中的操作与$1
第二个文件中的操作进行匹配。arr[$1]=$1
$1
请查找以下示例:
文件1:
1,111,,,,,,
2,111,,,,,,
3,100,,,,,,
4,111,,,,,,
文件2:
1,799,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
2,899,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
3,999,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
输出:
3,999,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,
答案1
你可以比较一下NR
和FNR
区分处理第一个文件或后续文件。这是因为FNR
是按文件重置,而NR
是运行计数。因此,只有在处理第一个文件时才会NR==FNR
满足条件。
要处理“较短”的文件,必须首先......
awk -F, 'NR==FNR{mapper[$1]=$2;counter[$2]++}...'
然后,处理“较长”文件,使其在满足您的条件时打印......
awk -F, 'NR!=FNR&&counter[mapper[$1]]<=2'
将两者放在一起:
awk -F, 'NR==FNR{mapper[$1]=$2;counter[$2]++}NR!=FNR&&counter[mapper[$1]]<=2'
默认情况下,awk
当选择条件匹配时打印整行,因此只需指定NR!=FNR&&counter[mapper[$1]]<=2
即可。