【问题标题】:Print name of the file in front of every line of file在文件的每一行前面打印文件名
【发布时间】:2014-10-03 23:12:23
【问题描述】:

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

我尝试为此创建一个“for”,但没有成功。

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

谢谢!

【问题讨论】:

    标签: linux bash shell for-loop


    【解决方案1】:

    使用 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
      

      【讨论】:

      • 怎么样?发生了什么/没有发生什么?如果有的话,你会遇到什么错误?我使用示例文件对其进行了测试,它对我有用。
      【解决方案3】:

      它不起作用,因为您需要使用 -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
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-08-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多