Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux printf后如何使用uniq_Linux_Bash_For Loop_Awk - Fatal编程技术网

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。类似于我上面的例子。这是一个非常好的解决方案。非常感谢。这是一个非常好的解决方案。非常感谢你。