在文件的每一行前面打印文件的名称

我有很多文本文件,我想在Linux中创build一个bash脚本来打印文件的每一行文件的名称。 例如我有文件lenovo.txt,我希望文件中的每一行都以lenovo.txt开头。

我试图为此做一个“为”,但没有工作。

for i in *.txt do awk '{print '$i' $0}' /var/SambaShare/$i > /var/SambaShare/new_$i done 

谢谢!

这是行不通的,因为你需要通过$i -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 -vi=$i '{print i,$0}' $i > new_$i done 

希望这可以帮助。

Awk和Bash没有共享相同的变量,因为它们是具有不同的解释器的不同的语言。 您应该使用-v选项将Bash变量传递给Awk。

您还应引用您的文件名变量,以确保它们不会作为单独的参数展开(如果它们包含空格)。

 for i in *.txt do awk -vi="$i" '{print i,$0}' "$i" > "$i" done 

使用grep你可以使用--with-filename (别名-H )选项并使用一个总是匹配的空模式:

 for i in *.txt do grep -H "" $i > new_$i done