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 列为负值。 xargs
和 sed
无法对此输出做任何事情来获得您想要的效果。 xargs sed -i ...
的输入必须是文件列表。整个尝试是不幸的。
参见 Cyrus 替代答案,或
perl -i.bak -aple 's/^/c/ if $F[-1]<0' stack1.txt
它可以任意混合使用制表符和空格作为分隔符。
我有以下名为 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 列为负值。 xargs
和 sed
无法对此输出做任何事情来获得您想要的效果。 xargs sed -i ...
的输入必须是文件列表。整个尝试是不幸的。
参见 Cyrus 替代答案,或
perl -i.bak -aple 's/^/c/ if $F[-1]<0' stack1.txt
它可以任意混合使用制表符和空格作为分隔符。