我有许多文本文件,想在Linux中编写一个bash脚本,在每个文件的每一行打印出文件名。例如,我有一个名为lenovo.txt的文件,我希望文件中的每一行都以lenovo.txt开头。
我尝试使用"for"循环实现,但没有成功。
for i in *.txt
do
awk '{print '$i' $0}' /var/SambaShare/$i > /var/SambaShare/new_$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
--with-filename
选项(别名-H
)并使用一个始终匹配的空模式:for i in *.txt
do
grep -H "" $i > new_$i
done
由于Awk和Bash是使用不同的解释器的不同编程语言,它们不共享相同的变量。你应该使用-v
选项将Bash变量传递给Awk。
你还应该引用文件名变量以确保如果它们包含空格,它们不会被扩展为单独的参数。
for i in *.txt
do
awk -v i="$i" '{print i,$0}' "$i" > "$i"
done