【问题标题】:awk without printing a newline for multiple filesawk 不为多个文件打印换行符
【发布时间】:2017-10-09 08:56:39
【问题描述】:

我有一个(希望如此)快速简单的问题,这让我有点发疯!我有一堆文件,我想从中打印 1 美元。每个文件都有几行输出,比如说两行。因此,如果我从一个文件中打印 $1,我可能会得到如下信息:

1 0

但是,我要做的是从所有文件中打印:

awk '{printf $1}' files*

当我这样做时,输出基本上只是一条长线:1110000111100000...等。不是我想要的。我希望输出是这样的:

1 0 
0 1
1 1

这样每一行代表每个文件的输出。

我试过了:

awk 'BEGIN { ORS=" " }; { print $1}'

并且进行了多次迭代,到目前为止还没有成功。我知道这应该很简单,但答案已经暗示了我,我们将不胜感激。郑重声明,这不适用于任何课程,仅适用于我自己的工作。另外,我确实在这里和其他地方看过其他帖子,但到目前为止没有任何效果。先感谢您。

【问题讨论】:

    标签: awk scripting newline


    【解决方案1】:

    在 GNU awk (gawk) 中尝试以下操作:

    awk '{printf "%s ", $1} ENDFILE {print ""}' files*
    

    第一个 printf 确实打印 $1 并用空格分隔。

    第二次打印在每个文件之后打印一个换行符。

    【讨论】:

    • 这将在每个输出行的末尾打印一个额外的空白字符。
    【解决方案2】:
    awk '{printf "%s%s", (FNR>1 ? OFS : ors), $0; ors=ORS} END{print ""}' file*
    

    说明:对于每一行,它都会打印一些内容(由三元表达式控制),然后是该行的内容。除了第一个文件(通过在读取第一行之前不设置 ors 来控制)之外,每个文件的第一行都是一个换行符,并且每隔一行是一个空白字符。完成所有文件后,它会打印一个终止换行符。

    【讨论】:

    • 谢谢 Ed,这似乎可行!只是为了仔细检查,对于我想要的任何列,我只需将 $0 更改为该列,对吗?另外,你能解释一下脚本是如何工作的吗?再次感谢!
    • 一旦您有足够的时间来收集和考虑答案,请参阅stackoverflow.com/help/someone-answers 了解下一步该做什么。
    猜你喜欢
    • 2011-01-02
    • 1970-01-01
    • 2017-08-17
    • 2013-05-23
    • 1970-01-01
    • 1970-01-01
    • 2022-06-10
    • 1970-01-01
    相关资源
    最近更新 更多