在每行文件前打印文件名

4

我有许多文本文件,想在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个回答

4

它不能正常工作,因为你需要使用-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

希望这可以帮到您。

4
使用grep命令时,您可以使用--with-filename选项(别名-H)并使用一个始终匹配的空模式:
for i in *.txt
do
    grep -H "" $i > new_$i
done

2

由于Awk和Bash是使用不同的解释器的不同编程语言,它们不共享相同的变量。你应该使用-v选项将Bash变量传递给Awk。

你还应该引用文件名变量以确保如果它们包含空格,它们不会被扩展为单独的参数。

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

1
怎么样?发生了什么或者没有发生什么?如果有的话,你得到了什么错误信息?我使用示例文件进行了测试,对我来说它是有效的。 - John B

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接