在具有相同定界符的多个实例的行上使用 cut - unix
using cut on a line having multiple instances of the same delimiter - unix
我正在尝试编写一个可以输入不同文件名的通用脚本。
这只是我的 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
如何使其通用?
非常感谢您的帮助。
脚本中的类似内容将 "cut" 它:
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
忽略完整路径。
- 它也是最后排序的,所以保证按照前缀排序
只需将 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.
我正在尝试编写一个可以输入不同文件名的通用脚本。
这只是我的 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
如何使其通用?
非常感谢您的帮助。
脚本中的类似内容将 "cut" 它:
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
忽略完整路径。 - 它也是最后排序的,所以保证按照前缀排序
只需将 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.