linux - 如何在 printf 之后使用 uniq

标签 linux bash for-loop awk

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

文件:

NAME1_C001_xxx.tsv
NAME1_C001_yyy.tsv
NAME2_C001_xxx.tsv
NAME2_C001_yyy.tsv

我只想打印 uniq 前缀 - NAME1 和 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;

最佳答案

你在这里根本不需要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

关于linux - 如何在 printf 之后使用 uniq,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40741522/

相关文章:

javascript - 获取for循环中的前一个元素

linux - 在 linux 中找到序列/排序被破坏的行

linux - Docker 无法看到 Laravel 创建的文件

php - 生成 shell 脚本时如何转义 shebang 行

bash - 静默检查 bash 脚本中是否存在 rpm

javascript - 如何使用for循环数组为折线图动态添加系列

python - for和if在Python中的用法

linux - HARK 语音识别

java - 使用 java/javafx 更改 Linux 中的 Activity/应用程序菜单栏

android - 将使用 adb 从手机相机传输照片的脚本