在“cut -d”;“-f3 |uniq -d”之后显示文件的行号

在“cut -d”;“-f3 |uniq -d”之后显示文件的行号

我正在尝试创建一个简单的命令,它可以显示一个特定列中的重复数据,并给出原始行号。

文件示例:

JENNIE;30;DOCTOR;F
SARA;26;POLICE;F
EDWARD;32;TEACHER;M
ROBERT;44;POLICE;M

使用以下命令我将从第 3 列获取重复项

cat FILE.txt |cut -d ";" -f3 |排序 |uniq -d

问题是我需要获取结果的原始行号。

我的命令显示:

POLICE
POLICE

我想得到

2- POLICE
4- POLICE

答案1

使用 GNUsort和 GNU uniq,您可以:

$ <FILE.txt awk -F';' '{print NR"- "$3}' | sort -st' ' -k2 | uniq -Df1
2- POLICE
4- POLICE

行首先按文本的词汇顺序排序,然后按数字排序(-s保留排序相同的文本的原始顺序)。添加一个| sort -n以按行号排序。

单独使用awk

awk -F';' '!x {c[$3]++}; x && c[$3] > 1 {print FNR"- "$3}' FILE.txt x=1 FILE.txt

答案2

您当前的管道似乎不太可能按照您声称的方式工作,但它无法与 BSD 或 GNU 工具一起使用。不确定您是否使用了其他工具。

我能够想出以下循环来完成您的要求:

for prof in $(cut -d\; -f3 FILE.txt | sort | uniq -d); do 
    awk -v pat="$prof" -F\; '$3 ~ pat{print NR"-",$3}' FILE.txt 
done

这将生成一个出现多次的职业列表,然后用于awk查找文件中每次出现的职业,打印行号和职业名称。

awk 将从管道收集的专业设置cut -d\; -f3 FILE.txt | sort | uniq -dpat参数,然后在文件中搜索第三个字段中包含该模式的行(用作;字段分隔符)。对于匹配的行,它将打印行号和第三个字段(用破折号分隔)。

相关内容