我有很多文本文件,我想在linux中创建一个bash脚本,在每行文件中打印文件名。例如,我有文件lenovo.txt,我希望文件中的每一行都以lenovo.txt开头。
我试图为此做一个“for”但是没有用。
for i in *.txt
do
awk '{print '$i' $0}' /var/SambaShare/$i > /var/SambaShare/new_$i
done
谢谢!
答案 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