删除每行特定逗号分隔字段中的重复条目

删除每行特定逗号分隔字段中的重复条目

所以我的文件格式如下,即制表符分隔的列,每列 csv

        1 B,B,B,B  C,C,C,C  D,D,D,D

        2 A,A,A,A  B,B,B,B  E,E,E,E

我想从每个文件中删除重复项,但以逐行的方式,其中每行重复项都被独立处理。

所以输出应该是

1 B C D
2 A B E 

答案1

使用perl 中的distinct(又名)uniq列表::更多实用工具模块

perl -MList::MoreUtils=distinct -alne '
  print join " ", map { join ",", distinct split "," } @F
' yourfile
1 B C D

2 A B E

如果您想要制表符分隔的输出,请将第一个更改join " "join "\t"

答案2

sed -Ee 's/([^,\t]*,?)+/\1/g' yourfile

我们在这里使用 GNU sed。

1       B       C       D
2       A       B       E

答案3

Python解决方案(在Python 3.5上测试):

del_duplicates.py脚本:

import sys
with open(sys.argv[1], 'r') as f:      # reading the file (passed in via command line)
    lines = f.read().splitlines()      # split the file into list of lines
    for l in lines:                    # for each line
        items = l.split('\t')          # split line by tab `\t`
        for k,i in enumerate(items):   # processing fields
            if k > 0: items[k] = ','.join(set(i.split(',')))  # getting unique values via set object
        print('\t'.join(items))        # join separate fields back into straight line

用法:

python del_duplicates.py yourfile

输出:

1   B   C   D
2   A   B   E

答案4

使用(大部分)bash:

输入文件(添加一行以查看非同质字段会发生什么情况。

1   B,B,B,B C,C,C,C D,D,D,D
2   A,A,A,A B,B,B,B E,E,E,E
3   L,M,M   N,O,N   X,Y,Z

从分隔符分隔的单词中删除重复项的函数。我在函数体中使用括号来将更改隔离到$IFS子 shell 中。不加引号$2是这里的魔力。

uniqify() (
    IFS=$1
    printf "%s\n" $2 | sort -u | paste -sd"$1"
)

来处理文件。

while read -ra words; do 
    for word in "${words[@]}"; do 
        uniqify , "$word"
    done | paste -s
done < input

输出

1   B   C   D
2   A   B   E
3   L,M N,O X,Y,Z

相关内容