awk:

awk:

我有一个名为的文件TempsModel.txt,其创建方式如下:

ls /media/Elise/2811226E69F71131/ModelOutput/* > TempsModel.txt

所以它列出了该目录中的所有文件。这些文件都是压缩的 netcdf 文件,因此看起来像这样:

/media/Elise/2811226E69F71131/ModelOutput/20091201_000000.nc.gz
/media/Elise/2811226E69F71131/ModelOutput/20091201_002023.nc.gz
/media/Elise/2811226E69F71131/ModelOutput/20091201_003009.nc.gz
/media/Elise/2811226E69F71131/ModelOutput/20091201_004020.nc.gz

我需要这个列表不包含.gz.如何删除这三个字符?我尝试提问在 shell 脚本中使用字符串操作删除字符串的最后一个字符从行中删除最后一个字符

但是如何创建第二个文件TempsModel2.txt,其中列表不包含最后三个字符?

答案1

使用创建该文件可能不是最佳实践ls,但考虑到您提供的示例输入,您可以使用

awk:

awk '{sub(/.gz$/, ""); print}' TempsModel.txt > TempsModel2.txt

sed:

sed 's/.gz$//' TempsModel.txt > TempsModel2.txt

为了创建没有 .gz 扩展名的初始文件,您可以执行以下操作:

for file in /media/Elise/2811226E69F71131/ModelOutput/*; do echo "${file%.gz}"; done > TempsModel.txt

你还可以这样做:

set -- /media/Elise/2811226E69F71131/ModelOutput/*
printf '%s\n' "${@%.gz}" > TempsModel.txt

答案2

如果 zsh 可用,则与此类似使用参数扩展生成参数列表mkdir -p,您可以使用 glob 限定符来动态删除后缀:

setopt histsubstpattern extendedglob

print -rl -- /media/Elise/2811226E69F71131/ModelOutput/*.gz(#q:s/%.gz/) > TempsModel2.txt

相关内容