【问题标题】:Awk - replacement with seperatorsawk - 用分隔符替换
【发布时间】:2022-01-25 12:56:44
【问题描述】:

我写了这个 awk 程序

awk '{x=$2-5; print $1, x, $3}' 

将每行中的第二个数字减少 5。

当输入如下:number1 number2 number3(即用空格分隔)时,这工作得很好。然后输出是 number1 number2-5 number3。

现在,如果数字由 ; 分隔,我如何扩展该程序以实现相同的功能而不是空格 - 任何人都可以帮助我吗?

例如输入是

30;31;32
11;6;5
1;7;10

那么预期的输出是

30;26;32
11;1;5
1;2;10

【问题讨论】:

  • edit您的问题并添加更多信息。您的输入文件是否同时包含 ;| 分隔符?显示一些示例输入和预期输出,均格式化为代码块。
  • 在 awk 手册页中查找 FSOFS
  • 您好,谢谢您的回答。虽然我有多行(从问题中不清楚,我的错误,对不起) - 那么这仍然是一个解决方案吗?
  • 是的,你拥有的行数与每行字段的分隔方式无关。
  • 嗨,Azes,欢迎来到令人生畏的 awk 世界。 awk 是一种非常强大但经常被低估的语言。大多数文档非常详尽,不适合直接使用。所以我建议看一下Awk one-liners explained,它教你 awk 并解释它。它并不总是能满足您的直接需求,但它肯定会在您的道路上为您提供帮助。

标签: linux awk


【解决方案1】:

你们很亲密!

您只需要更改FSOFS 变量,剩下的就交给awk:

awk 'BEGIN{FS=OFS=";"}
{x=$2-5; print $1, x, $3}' file
30;26;32
11;1;5
1;2;10

awk manual 中了解这些变量。


正如 Ed Morton 在 cmets 中所说,如果您知道输入和输出具有相同数量的字段,您还可以使用更惯用的 awk:

awk 'BEGIN{FS=OFS=";"}
{$2-=5; print}' 

或者:

awk 'BEGIN{FS=OFS=";"}
{$2-=5} 1'    # the 1 is True and awk reacts to a true by printing

【讨论】:

    猜你喜欢
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多