Linux 在文件的每一行前面打印文件名
我有很多文本文件,我想在linux中制作一个bash脚本,在每行文件中打印文件名。例如,我有文件lenovo.txt,我希望文件中的每一行都以lenovo.txt开头 我试着为这个做一个“赞成”,但没有成功Linux 在文件的每一行前面打印文件名,linux,bash,shell,for-loop,Linux,Bash,Shell,For Loop,我有很多文本文件,我想在linux中制作一个bash脚本,在每行文件中打印文件名。例如,我有文件lenovo.txt,我希望文件中的每一行都以lenovo.txt开头 我试着为这个做一个“赞成”,但没有成功 for i in *.txt do awk '{print '$i' $0}' /var/SambaShare/$i > /var/SambaShare/new_$i done 谢谢 Awk和Bash不共享相同的变量,因为它们是不同的语言,有不同的解释器。您应该使用-
for i in *.txt
do
awk '{print '$i' $0}' /var/SambaShare/$i > /var/SambaShare/new_$i
done
谢谢 Awk和Bash不共享相同的变量,因为它们是不同的语言,有不同的解释器。您应该使用
-v
选项将Bash变量传递给Awk
您还应该引用文件名变量,以确保它们在包含空格时不会作为单独的参数展开
for i in *.txt
do
awk -v i="$i" '{print i,$0}' "$i" > "$i"
done
它不起作用,因为您需要使用
-v
选项将$i
传递给awk。但您也可以在awk中使用FILENAME
内置变量:
ls *txt
file.txt file2.txt
cat *txt
A
B
C
A2
B2
C2
for i in *txt; do
awk '{print FILENAME,$0}' $i;
done
file.txt A
file.txt B
file.txt C
file2.txt A2
file2.txt B2
file2.txt C2
要重定向到新文件,请执行以下操作:
for i in *txt; do
awk '{print FILENAME,$0}' $i > ${i%.txt}_new.txt;
done
至于你的更正版本:
for i in *.txt
do
awk -v i=$i '{print i,$0}' $i > new_$i
done
希望这有帮助。使用grep,您可以使用
--with filename
(别名-H
)选项,并使用始终匹配的空模式:
for i in *.txt
do
grep -H "" $i > new_$i
done
怎么用?发生了什么/没有发生什么?如果有错误,您会遇到哪些错误?我使用示例文件对它进行了测试,它对我很有效。