2016-11-22 37 views
1

後,我有很多的文件,我需要用相同的前綴一起串聯。我有一個想法,但我不知道如何解決這個問題:如何使用uniq的printf的

文件:

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; 

但這種方法不太好。我有兩個前綴。

謝謝你的幫助。

編輯:

一種解決方案由於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 

您還可以使用_FS在AWK:

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

謝謝anubhava - 這就是看OT的偉大工程! – 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