如何打印具有重复 (x2) 值的行?
例如
01 02 03
01 01 03
01 01 01 03
这三行中,只有第二行是正确的。
现在假设我想查找值出现 x3 的行。
在这种情况下,第 3 行是正确的。
答案1
用 awk
awk -v nb=3 '{for(i=1;i<=NF;i++)if(++a[$i]>nb){print;next}}' infile
for(i=1;i<=NF;i++) 在 ++a[$i] 行的每个字段上
获取关联数组 a 中的每个字段,并在每次看到具有相同值的字段时递增它。
if(++a[$i]>nb) 如果值大于 nb
{print;next} 打印该行并跳转到下一行
仅显示行nb
awk -v nb=3 '
{
max = 0
delete a
for ( i=1 ; i<=NF ; i++ )
++a[$i]
for( j in a )
max = a[j]>max ? a[j] : max
if ( max == nb )
print
}' infile
答案2
使用 AWK:
awk -v t=2 '{for (i=1; i<=NF; i++) c[$i]++; for (v in c) if (c[v] == t) {print; next}}'
这会处理每一行,并在每一行内计算关联数组中每个值(每个字段)的出现次数c
;然后它会遍历它看到的所有值v
,如果其中一个值被看到所需的次数(由目标指定t
),它会打印该行,并跳到下一行以避免多次打印该行次(例如为了01 01 03 03
)。
答案3
这只会打印具有重复空格分隔单词的行:
while IFS='' read -r line ; do if [[ "`echo $line | tr ' ' '\n'| sort | uniq -d`" != '' ]]; then echo "$line"; fi; done < YOURFILE
对于您的示例,输出将是:
01 01 03
01 01 01 03
在这里,对于第 2 行和第 3 行中多次出现的“01”...
如果你想指定一个单词应该被检查重复的次数,那么:
NO=3; lnr=1 ; while IFS='' read -r line ; do echo "for line" $lnr ; echo $line | tr ' ' '\n' | uniq -c| grep -e "^\s*$NO" ; ((lnr++)); done < YOURFILE
对于您的示例输出将是:
对于 1 号线
2号线
3号线
3 01
NO
第一个数字是您在变量中指定要检查的出现次数的次数。
第二个数字是被发现没有重复的实际单词。
当然,将 YOURFILE 更改为您的文件。