所以我的文件格式如下,即制表符分隔的列,每列 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