我有很多*.txt
个文件。我想从每个文件中提取第3列和第5列,并将它们保存为新文件,保留其new_
扩展名的原始名称。我在尝试这样做时有这个bash循环,但是没有做我想要的。有人可以帮帮我吗?
for i in *.txt; do
cut -f 3,5 $i > /media/owner/new_$i_assembly.txt
done
答案 0 :(得分:3)
简单方法:
for f in *.txt; do
cut -d$'\t' -f3,5 "$f" > "/media/owner/new_${f}_assembly.txt"
done
如果可能存在除标签之外的空格 - 您可以使用以下awk
方法:
for f in *.txt; do
awk '{ print $3,$5 }' OFS='\t' "$f" > "/media/owner/new_${f}_assembly.txt"
done
答案 1 :(得分:1)
您必须确保并明确告诉Bash扩展变量cd /opt/tomcat/bin
sudo ./catalina.sh run
,否则它会选择您不想要的字符并扩展变量$i
:
$i_assembly
如果您不希望新名称中包含该扩展程序,请使用参数展开for i in *.txt; do
cut -f 3,5 "$i" > "/media/owner/new_${i}_assembly.txt"
done
,从最后删除所有内容${i%.*}
之前的内容。
.
如果您决定使用可能导致路径的其他方法,而不仅仅是文件名(例如:for i in *.txt; do
cut -f 3,5 "$i" > "/media/owner/new_${i%.*}_assembly.txt"
done
),则可以再次使用参数扩展来获取文件的名称:
**/*.txt
另请注意, TAB 是for i in **/*.txt; do
base=${i##*/}
base=${base%.*}
cut -f 3,5 "$i" > "/media/owner/new_${base}_assembly.txt"
done
的默认分隔符,您无需使用cut
选项指定它:
-d