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

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不共享相同的变量,因为它们是不同的语言,有不同的解释器。您应该使用-

我有很多文本文件,我想在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不共享相同的变量,因为它们是不同的语言,有不同的解释器。您应该使用
-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

怎么用?发生了什么/没有发生什么?如果有错误,您会遇到哪些错误?我使用示例文件对它进行了测试,它对我很有效。