具有两个 awk 输入文件的数组

具有两个 awk 输入文件的数组

我有两个文件,一个包含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

你可以比较一下NRFNR区分处理第一个文件或后续文件。这是因为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即可。

相关内容