2016-11-22 5 views
1

私は、同じプレフィックスで連結する必要のあるファイルがたくさんあります。私はアイデアを持っているが、私はこの問題を解決する方法がわからない:printfの後でuniqを使う方法

ファイル:

NAME1_C001_xxx.tsv 
NAME1_C001_yyy.tsv 
NAME2_C001_xxx.tsv 
NAME2_C001_yyy.tsv 

私はちょうどuniqの接頭印刷したい - NAME1 and NAME2を。接頭辞と接尾辞の文字列の長さは異なりますが、常に接頭辞の前_C001

私の解決策は次のとおりです。

fo i in *.tsv 

do prexix=$(printf "%s\n" "${i%_C001*}") 

cat $prefix_C001_xxx.tsv $prefix_C001_yyy.tsv > ${i%_C001*}.merged.tsv 

done; 

しかし、このソリューションは非常に良いではありません。私は各プレフィックスを2回持っています。

ありがとうございました。

EDITED:anubhavaに

一つの解決策のおかげ:

fo i in $(printf "%s\n" *.tsv | awk -F '_C001' '!seen[$1]++{print $1}') 

    do 

    cat $prefix_C001_xxx.tsv $prefix_C001_yyy.tsv > ${i%_C001*}.merged.tsv 

    done; 
+0

最終的なファイル名は何ですか? – Inian

+0

は、接頭辞NAME1.merged.tsvにする必要があります。上記の私の例に似た何か。 – Paul

答えて

2

あなたのファイル名を使用すると、フィールドセパレータを使用して独自の接頭辞を印刷するawkコマンドへのパイプあなたのリストをすることができます任意の改行を含まないのでas _C001

printf "%s\n" *.tsv | awk -F '_C001' '!seen[$1]++{print $1}' 
NAME1 
NAME2 

_ awkではFSとして:

printf "%s\n" *.tsv | awk -F _ '!seen[$1]++{print $1}' 
+1

ありがとうございましたanubhava - それは素晴らしい作品です! – Paul

4

あなたはここですべてのprintfは必要ありません。すでに使用しているパラメータ置換を囲む不要なラッパーです。

for i in *.tsv 
do prefix=${i%_C001*} 
    [[ -f $prefix.merged.tsv ]] && continue # Avoid doing the same prefix twice 
    cat "${prefix}"_* > "$prefix.merged.tsv" 
done 
+0

これはとても良い解決策です。どうもありがとうございます。 – Paul

関連する問題