【问题标题】:Add file name as a new column with awk使用 awk 添加文件名作为新列
【发布时间】:2023-01-07 23:35:58
【问题描述】:

首先,现有问题并没有解决我的问题,这就是我再次提问的原因。

我有两个 txt 文件 temp.txt

adam    12
george  15
thomas  20

和演示.txt

mark    8
richard 11
james   18

我想将它们组合起来并添加第 3 列作为它们的不带扩展名的文件名,如下所示:

adam    12   temp
george  15   temp
thomas  20   temp
mark    8    demo
richard 11   demo
james   18   demo

我使用了这个脚本:

for i in $(ls); do name=$(basename -s .txt $i)| awk '{OFS="\t";print $0, $name} ' $i; done

但它产生下表:

mark    8   mark    8
richard 11  richard 11
james   18  james   18
adam    12  adam    12
george  15  george  15
thomas  20  thomas  20

我不明白为什么它将名称变量作为整个表。

提前致谢。

【问题讨论】:

    标签: awk filenames basename


    【解决方案1】:

    Awk 无法访问 Bash 的变量,反之亦然。在 Awk 脚本中,name 未定义,因此 $name 被解释为 $0

    另外,don't use ls in scripts,quote your shell variables.

    最后,name 的赋值不会打印任何内容,因此将其输出通过管道传递给 Awk 是没有意义的。

    for i in ./*; do
        name=$(basename -s .txt "$i")
        awk -v name="$name" '{OFS="	";print $0, $name}' "$i"
    done
    

    因此,basename 计算可以很容易地在 Awk 中本地执行,但我将其留作练习。 (提示:sub(regex, "", FILENAME)

    【讨论】:

      【解决方案2】:

      首先,您需要取消屏蔽单引号内的$name,这样就不会被 shell 中的文件名替换。完成后,您需要在 $name 周围添加双引号,以便 awk 将其视为字符串:

      for i in $(ls); do name=$(basename -s .txt $i); awk '{OFS="	";print $0, "'$name'"} ' $i; done
      

      【讨论】:

        猜你喜欢
        • 2017-07-09
        • 1970-01-01
        • 2023-02-05
        • 1970-01-01
        • 2021-06-13
        • 2013-10-11
        • 1970-01-01
        • 2019-04-16
        • 2021-02-11
        相关资源
        最近更新 更多