2016-11-22 3 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; 

Но это решение не очень хорошо. У меня есть каждый префикс дважды.

Благодарим за помощь.

EDITED:

Одно из решений благодаря анубхава:

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 на печать уникальных префиксов, используя разделитель полей в _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 - это выглядит отлично! – 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