如何在printf之后使用uniq

时间:2016-11-22 12:11:40

标签: linux bash for-loop awk

我有很多文件需要与相同的前缀连接在一起。我有个主意,但我不知道如何解决这个问题:

文件:

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;

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

由于您的文件名不包含任何换行符,您可以将列表移至awk命令,以使用字段分隔符_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}'