AWK 使用 AWK 和 Sed 填充空列不起作用

AWK populating an empty column with AWK and Sed is not working

我有以下名为 stack1.txt 的文件:

        Date    Item    Amount
        2020-01-23      Petrol  -160
        2020-03-24      Electricity     -200
        2020-04-24      Electricity     -200
        2020-05-30      Trim line       -50
        2021-03-11      Martha Burns    150
        2021-03-14      Highbury shops  300

我在 $1 处创建了一个我希望填充的空列,因此 $4 列中的负数在 $1 列中得到一个“c”,例如

        Date    Item    Amount
c       2020-01-23      Petrol  -160
c       2020-03-24      Electricity     -200
c       2020-04-24      Electricity     -200
c       2020-05-30      Trim line       -50
        2021-03-11      Martha Burns    150
        2021-03-14      Highbury shops  300

我试过以下命令:

awk -F '\t' ' < 0 {print }' stack1.txt | xargs -r sed -i 's//c/g'

如果我 cat stack1.txt 我仍然得到一个不变的 table 如上所述。最初我使用不带 -r 的 xargs 并得到 sed: no input files。 -r 删除了这个。我也试过's/""/c/g'。我正在尝试将更改后的输出保存回 stack1.txt,因此 sed -i。然而,我不知道为什么这不起作用。感谢对此的一些帮助。

使用sed

$ sed '/-.\?..$/s/^/c/;/^c/! s/ \+/& /' input_file
   Date    Item    Amount
c        2020-01-23      Petrol  -160
c        2020-03-24      Electricity     -200
c        2020-04-24      Electricity     -200
c        2020-05-30      Trim line       -50
         2021-03-11      Martha Burns    150
         2021-03-14      Highbury shops  300

awk 'BEGIN{ FS=OFS="\t" } <0{ ="c" }1' file

输出:

        Date    Item    Amount
c       2020-01-23      Petrol  -160
c       2020-03-24      Electricity     -200
c       2020-04-24      Electricity     -200
c       2020-05-30      Trim line       -50
        2021-03-11      Martha Burns    150
        2021-03-14      Highbury shops  300

参见:Save modifications in place with awk

要回答“为什么这不起作用”这个问题,您应该一一测试管道的组件。

awk -F '\t' ' < 0 {print }' stack1.txt

打印四行空行,每行一行与原始文件的第 4 列为负值。 xargssed 无法对此输出做任何事情来获得您想要的效果。 xargs sed -i ... 的输入必须是文件列表。整个尝试是不幸的。

参见 Cyrus 替代答案,或

perl -i.bak -aple 's/^/c/ if $F[-1]<0' stack1.txt

它可以任意混合使用制表符和空格作为分隔符。