如何循环多个文件以提取特定列并另存为单独的文件?

时间:2017-12-01 23:50:43

标签: linux string bash unix

我有很多*.txt个文件。我想从每个文件中提取第3列和第5列,并将它们保存为新文件,保留其new_扩展名的原始名称。我在尝试这样做时有这个bash循环,但是没有做我想要的。有人可以帮帮我吗?

for i in *.txt; do
cut -f 3,5 $i  > /media/owner/new_$i_assembly.txt 
done

2 个答案:

答案 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