我有一个文本文件片段(此文本文件很大):
114303 SOL1443
114311 SOL679
114316 SOL679
114432 SOL1156
114561 SOL122
114574 SOL2000
114952 SOL3018
115597 SOL609
115864 SOL2385
115993 SOL3448
SOL2 61571
SOL3 87990
SOL4 96242
SOL5 6329
SOL5 16550
SOL9 84894
SOL9 84911
SOL12 91985
SOL15 85816
我需要编写脚本来删除具有重复SOLnumber的行。 SOL是在第一列还是第二列中都没有关系 例如,在文字中我有
115993 SOL269
SOL269 84911
12373 SOL269
所以我的脚本将删除第二行和第三行
SOL269 84911
12373 SOL269
我知道我可以在awk中使用
awk '!seen[$0]++' data.txt
删除重复的行,但是会删除每列中具有相同单词的行。 请帮帮我!
答案 0 :(得分:1)
您需要提取SOL
的值并基于该文件对文件内容进行分组。以下命令使用正则表达式match()
函数在包含模式SOL
和数字的当前行中进行匹配,并将捕获的组存储在变量sol
中。
现在使用变量中的值,使用逻辑!unique[sol]++
仅列出包含模式的行一次。
awk 'match($0, /SOL[[:digit:]]+/){ sol = substr($0, RSTART, RLENGTH); } !unique[sol]++'
不说perl
比以上更好,但是您可以做到
perl -ne '/(SOL\d+)/; print unless $unique{$1}++' file
答案 1 :(得分:0)
由于您的SOL
字段并不总是位于同一位置,因此您首先必须找到它。
awk '{
end=substr($0, index("SOL", $0))
sol=substr(end, 0, index(" ", end))
}
!seen[sol]++
' data.txt
答案 2 :(得分:0)
您可以执行此操作,与awk命令的想法相同(只需进行一些预处理以选择要在可见数组中使用的列:
awk '{if($1 ~ /^SOL/){sol_kw=$1}else{sol_kw=$2}}!seen[sol_kw]++' <file>