在每行文件前打印文件名

时间:2014-08-11 07:31:26

标签: linux bash shell for-loop

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

我试图为此做一个“for”但是没有用。

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

谢谢!

3 个答案:

答案 0 :(得分:4)

它不起作用,因为您需要使用$i选项将-v传递给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

希望这有帮助。

答案 1 :(得分:2)

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

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

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

答案 2 :(得分:2)

使用grep,您可以使用--with-filename(别名-H)选项并使用始终匹配的空模式:

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