Linux printf后如何使用uniq
我有很多文件,我需要用相同的前缀连接在一起。我有一个想法,但我不知道如何解决这个问题: 档案:Linux printf后如何使用uniq,linux,bash,for-loop,awk,Linux,Bash,For Loop,Awk,我有很多文件,我需要用相同的前缀连接在一起。我有一个想法,但我不知道如何解决这个问题: 档案: NAME1_C001_xxx.tsv NAME1_C001_yyy.tsv NAME2_C001_xxx.tsv NAME2_C001_yyy.tsv 我只想打印uniq前缀-NAME1和NAME2。前缀和后缀中的字符串长度不同,但总是在前缀\u C001 我的解决办法是: fo i in *.tsv do prexix=$(printf "%s\n" "${i%_C001*}") cat $
NAME1_C001_xxx.tsv
NAME1_C001_yyy.tsv
NAME2_C001_xxx.tsv
NAME2_C001_yyy.tsv
我只想打印uniq前缀-NAME1和NAME2
。前缀和后缀中的字符串长度不同,但总是在前缀\u 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;
由于文件名不包含任何换行符,您可以通过管道将列表发送到
awk
命令,以使用字段分隔符作为\u C001
打印唯一前缀:
printf "%s\n" *.tsv | awk -F '_C001' '!seen[$1]++{print $1}'
NAME1
NAME2
您也可以在awk中使用\uuu
作为FS
:
printf "%s\n" *.tsv | awk -F _ '!seen[$1]++{print $1}'
由于文件名不包含任何换行符,您可以通过管道将列表发送到
awk
命令,以使用字段分隔符作为\u C001
打印唯一前缀:
printf "%s\n" *.tsv | awk -F '_C001' '!seen[$1]++{print $1}'
NAME1
NAME2
您也可以在awk中使用\uuu
作为FS
:
printf "%s\n" *.tsv | awk -F _ '!seen[$1]++{print $1}'
这里根本不需要
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
这里根本不需要
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
您期望的最终文件名是什么?应为前缀-NAME1.merged.tsv。类似于我上面的示例。您期望的最终文件名是什么?应该是prefix-NAME1.merged.tsv。类似于我上面的例子。这是一个非常好的解决方案。非常感谢。这是一个非常好的解决方案。非常感谢你。