我有很多文本文件,我想在Linux中创build一个bash脚本来打印文件的每一行文件的名称。 例如我有文件lenovo.txt,我希望文件中的每一行都以lenovo.txt开头。
我试图为此做一个“为”,但没有工作。
for i in *.txt do awk '{print '$i' $0}' /var/SambaShare/$i > /var/SambaShare/new_$i done
谢谢!
这是行不通的,因为你需要通过$i
-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 -vi=$i '{print i,$0}' $i > new_$i done
希望这可以帮助。
Awk和Bash没有共享相同的变量,因为它们是具有不同的解释器的不同的语言。 您应该使用-v
选项将Bash变量传递给Awk。
您还应引用您的文件名变量,以确保它们不会作为单独的参数展开(如果它们包含空格)。
for i in *.txt do awk -vi="$i" '{print i,$0}' "$i" > "$i" done
使用grep你可以使用--with-filename
(别名-H
)选项并使用一个总是匹配的空模式:
for i in *.txt do grep -H "" $i > new_$i done