【问题标题】:AWK populating an empty column with AWK and Sed is not workingAWK 使用 AWK 和 Sed 填充空列不起作用
【发布时间】:2021-12-31 19:42:48
【问题描述】:

我有以下名为 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' '$4 < 0 {print $1}' stack1.txt | xargs -r sed -i 's//c/g'

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

【问题讨论】:

  • 我的字段分隔符是一个标签。

标签: awk sed xargs txt


【解决方案1】:
awk 'BEGIN{ FS=OFS="\t" } $4<0{ $1="c" }1' file

输出:

日期 项目 金额 c 2020-01-23 汽油-160 c 2020-03-24 电-200 c 2020-04-24 电-200 c 2020-05-30 修剪线-50 2021-03-11 玛莎烧伤 150 2021-03-14 海布里店铺300家

见:Save modifications in place with awk

【讨论】:

  • 为什么要在大括号后面加 1?
  • awk1 评估为true,因此它打印$0。长版:{ print }
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

    打印四个空行,每一行对应于原始文件的负列 4。 xargssed 无法使用此输出来获得您想要的效果。 xargs sed -i ... 的输入必须是文件列表。整个尝试都是不幸的。

    请参阅Cyrus 答案以获取替代方案,或

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

    使用任意组合的制表符和空格作为分隔符。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-12
      • 1970-01-01
      • 1970-01-01
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多