だから私のファイル形式は、タブで区切られた列、列あたり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行ずつ処理されます。
したがって、出力は次のようになります
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
サブシェルに分割しました。引用符がないというのが$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