【问题标题】:Design the output with awk or gawk script使用 awk 或 gawk 脚本设计输出
【发布时间】:2025-12-07 11:05:03
【问题描述】:

我有一个 awk 脚本,它在 .txt 文件中给出了我想要的结果,但我关心的是如何给出结果:我将它们全部放在一行中,我想设计它。

20140201 -73828274 20140202 7376288374 20140203 3837482437 ....... 20140228 -73629277

我希望输出以这种格式显示

20140201          -73828274
20140202         7376288374
20140203         3837482437
n                  n
n                  n
n                  n
20140228           73629277

我想要日期一侧和日期前面对应的总数

这里使用的 awk 脚本

$ for file in *.txt;do awk -F,'NR==1{header=$0; next} {a[$1]+=$6+$14} END {for (i in a) {print i, a[i]};}' $file; done > red.txt

有什么想法吗?

【问题讨论】:

  • 这基本上就是您打印输出的方式。您能否分享脚本以便我们提出更改建议?
  • @KannanMohan 我添加了脚本

标签: awk gawk


【解决方案1】:

您可以使用printf 而不是print。更改awk 脚本的END{} 部分,如下所示:

END {for (i in a) {printf "%d\t%d\n", i, a[i]};}

在两个值 (%d) 之间打印一个制表符 (\t) 并在末尾打印一个换行符 (\n)。

或者你的完整命令:

for file in *.txt;do awk -F,'NR==1{header=$0; next} {a[$1]+=$6+$14} END {for (i in a) {printf "%d\t%d\n", i, a[i]};}' $file; done > red.txt

【讨论】:

  • 它在 shell 上工作正常,但在 txt 文件上打印时我仍然遇到同样的问题
  • 您有同样的问题,因为该问题与您的 awk 脚本无关。这就是显示文件内容的方式。
【解决方案2】:

使用greptr,如下所示,

$ grep -oP '\S+\s+\S+' file | tr ' ' '\t'
20140201    -73828274
20140202    7376288374
20140203    3837482437
20140228    -73629277

【讨论】:

    【解决方案3】:

    您不需要 shell 循环,awk 完全能够处理多个文件,例如使用 GNU awk 处理 ENDFILE 并删除数组:

    awk -F, 'FNR>1{a[$1]+=$6+$14} ENDFILE{for (i in a) print i, a[i]; delete a}' *.txt > red.txt
    

    上述内容显然未经测试,因为您没有提供任何示例输入。

    您发布的脚本不能产生您显示的输出。在 awk 脚本运行之后,您还需要做一些其他的事情,以使您看起来好像输出文件的所有行都在一行上。我怀疑您可能没有再次引用变量(就像您没有在脚本中引用 $file 一样)并执行以下操作:

    var=$(cat red.txt)
    echo $var
    

    一旦您的脚本运行完毕,只需执行cat red.txt,您就会看到内容并不像您声称的那样全部在一行中。

    【讨论】:

      【解决方案4】:

      她是用awk做的简单方法

      awk -v RS=" " 'ORS=NR%2?RS:"\n"' file
      20140201 -73828274
      20140202 7376288374
      20140203 3837482437
      

      首先我们将记录选择器设置为空格,因此每个日期都是一个新行。
      然后我们根据奇偶行号将输出记录选择器更改为空格或换行符。


      你也可以使用 getline 这个,但要小心,getline 有很多陷阱。

      awk -v RS=" " '{a=$0;getline;print a,$0}' file
      20140201 -73828274
      20140202 7376288374
      20140203 3837482437
      

      这样您就可以使用printf对输出进行更多控制

      【讨论】:

      • 在shell上没问题!我有我想要的设计,但是当我想要在 txt 文件上输出时,我仍然在一行上有所有元素 awk -v RS=" " '{a=$0;getline;print a,$0}' file > output. txt "这是我使用的脚本"
      • 没关系,我修好了 :)