我有很多文件需要与相同的前缀连接在一起。我有个主意,但我不知道如何解决这个问题:
文件:
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 :(得分: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}'