我正在尝试创建一个简单的命令,它可以显示一个特定列中的重复数据,并给出原始行号。
文件示例:
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 -d
为pat
参数,然后在文件中搜索第三个字段中包含该模式的行(用作;
字段分隔符)。对于匹配的行,它将打印行号和第三个字段(用破折号分隔)。