【问题标题】:using cut on a line having multiple instances of the same delimiter - unix在具有相同分隔符的多个实例的行上使用 cut - unix
【发布时间】:2016-11-03 20:01:17
【问题描述】:

我正在尝试编写一个可以输入不同文件名的通用脚本。

这只是我的 bash 脚本的一小部分。

例如,假设文件夹 444-55 有 2 个文件

qq.filter.vcf
ee.filter.vcf

我希望我的输出是 -

qq
ee

我试过了,效果很好——

ls /data2/delivery/Stack_overflow/1111_2222_3333_23/secondary/444-55/*.filter.vcf | sort | cut -f1 -d "." | xargs -n 1 basename

但是假设我有一个这样的文件夹 -

/data2/delivery/Stack_overflow/de.1111_2222_3333_23/secondary/444-55/*.filter.vcf

我的脚本的输出将是

de
de

我怎样才能使它通用?

非常感谢您的帮助。

【问题讨论】:

    标签: bash unix cut


    【解决方案1】:

    脚本中这样的东西会“剪切”它:

    for i in /data2/delivery/Stack_overflow/1111_2222_3333_23/secondary/444-55/*.filter.vcf
    do
       basename "$i" | cut -f1 -d.
    done | sort
    

    优点:

    • 它不解析ls的输出,即frowned upon
    • 它在应用basename 处理后 被切断,cut 忽略完整路径。
    • 它也排在最后,所以保证按照前缀排序

    【讨论】:

    【解决方案2】:

    只需将 basename 调用移到管道中的前面即可:

    printf "%s\n" /data2/delivery/Stack_overflow/1111_2222_3333_23/secondary/444-55/*.filter.vcf |
      xargs -n 1 basename |
      sort |
      cut -f1 -d.
    

    【讨论】:

    • echo 代替printf 就够了吗?答案很好,因为它避免了for 循环。
    • 不,因为您需要将文件名放在单独的行上,以便 xargs 可以读取它们
    • 我明白了。好把戏。顺便说一句,为什么我们必须对 shell 已经排序的东西进行排序?也许一些奇异的文件系统以随机顺序(clearcase MVFS)发布文件,但在标准文件系统上它似乎没用。
    • 是的,没错。
    猜你喜欢
    • 2014-10-16
    • 1970-01-01
    • 2016-04-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-15
    • 1970-01-01
    • 1970-01-01
    • 2015-05-20
    相关资源
    最近更新 更多