0

我有一个文本文件,其中包含以下形式的一些行

*,[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 命令是什么?

4

5 回答 5

5
awk -F, '!seen[tolower($1)]++' file
于 2012-11-15T20:54:30.050 回答
1

您可以这样做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 } }'
于 2012-11-15T19:31:46.437 回答
0
#!/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

使用数组而不是关联(哈希),这会降低性能。但它似乎工作。

于 2012-11-15T19:32:31.700 回答
0

这可能对您有用(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}//'
  1. 给每一行编号。
  2. 按第一个键排序(忽略大小写)
  3. 删除重复项(基于特定标准)
  4. 将缩小的文件排序回原始顺序
  5. 删除行号
于 2012-11-16T07:13:22.963 回答
0

搜索

(?:(?<=\n)|^)(.*)((?:,(?:d|l|fr)og){2}(?:,[01]){3})(?=\n)([\s\S]*)(?<=\n).*\2(?:\n|$)

...并替换为

$1$2$3
于 2012-11-15T19:18:56.693 回答