我有一个文本文件,其中包含以下形式的一些行
*,[anything, even blanks],[dog|log|frog],[dog|log|frog],[0|1],[0|1],[0|1]
我想删除具有相同值的重复行*
(不区分大小写),即剩下的任何,[anything, even blanks],[dog|log|frog],[dog|log|frog],[0|1],[0|1],[0|1]
例如,下面是一个示例文本文件
test,bar,log,dog,0,0,0
one
foo,bar,log,dog,0,0,0
/^test$/,bar,log,dog,0,0,0
one
FOO,,frog,frog,1,1,1
生成的文本文件应该删除重复foo
(只要删除重复项,顺序对我来说无关紧要,留下 1 个唯一)
test,bar,log,dog,0,0,0
one
/^test$/,bar,log,dog,0,0,0
one
FOO,,frog,frog,1,1,1
我能做的最简单的 bash 命令是什么?
awk -F, '!seen[tolower($1)]++' file
你可以
用这样的awk
来做到这一点(因为你不在乎保留哪些重复项):
awk -F, '{lines[tolower($1)]=$0}END{for (l in lines) print lines[l]}'
如果您想保留第一个:
awk -F, '{if (lines[tolower($1)]!=1) { print; lines[tolower($1)]=1 } }'
搜索
(?:(?<=n)|^)(.*)((?:,(?:d|l|fr)og){2}(?:,[01]){3})(?=n)([sS]*)(?<=n).*2(?:n|$)
。并替换为
$1$2$3
#!/bin/bash
for line in $(cat $1)
do
key=$( echo ${line%%,*} | awk '{print tolower($0)}')
found=0
for k in ${keys[@]} ; do [[ "$k" == "$key" ]] && found=1 && break ; done
(( found )) && continue
echo $line
keys=( "${keys[@]}" "$key" )
done
使用数组而不是关联(哈希),后者的性能较低。但它似乎有效。
这可能对你有用(GNU sed):
cat -n file |
sort -fk2,2 |
sed -r ':a;$!N;s/^.{7}([^,]*),[^,]*(,(d|l|fr)og){2}(,[01]){3}n(.{7}1,[^,]*(,(d|l|fr)og){2}(,[01]){3})$/5/i;ta;P;D' |
sort -n |
sed -r 's/^.{7}//'
- 对每行进行编号。
- 按第一个键排序(忽略大小写)
- 删除重复项(基于特定条件)
- 将缩减的文件排序回原始顺序
- 删除行号