【问题标题】:awk command output to a text fileawk 命令输出到文本文件
【发布时间】:2013-12-26 17:33:48
【问题描述】:

我知道如何使用 > 将简单 awk 代码的输出写入文本文件或使用 >> 将其附加到文本文件中

但这里的问题是不同的,

这是我的代码行,其输出需要写入文本文件,

stty -F /dev/ttyUSB0 ispeed 4800 && awk -F"," '/SUF/ {print $3,$4,$5,$6,$10,$11,substr($2,1,2),".",substr($2,3,2),".",substr($2,5,2)}' < /dev/ttyUSB0

这里-F用于定义字段分隔符,即,,上面的行旨在搜索任何与SUF匹配的内容并打印其第3、4、5、6、10和11个值, 以及第二个值的一部分……这些值是从 USB 设备/dev/ttyUSB0读取的

上述命令运行良好,输出正确,

这是示例输出,

SUF Third Fourth Fifth Sixth Tenth Eleventh AA.BB.CC
SUF Third Fourth Fifth Sixth Tenth Eleventh AA.BB.CC
SUF Third Fourth Fifth Sixth Tenth Eleventh AA.BB.CC
SUF Third Fourth Fifth Sixth Tenth Eleventh AA.BB.CC
SUF Third Fourth Fifth Sixth Tenth Eleventh AA.BB.CC
SUF Third Fourth Fifth Sixth Tenth Eleventh AA.BB.CC
SUF Third Fourth Fifth Sixth Tenth Eleventh AA.BB.CC

问题是,输出不会停止,它的形式类似于无限循环,我必须按CTRL+C 来终止它。

现在真正的问题是, 如何将此输出写入文本文件?

尝试:

到目前为止,我已经尝试将此输出写入文本文件,

stty -F /dev/ttyUSB0 ispeed 4800 && awk -F"," '/SUF/ {print $3,$4,$5,$6,$10,$11,substr($2,1,2),".",substr($2,3,2),".",substr($2,5,2)}' < /dev/ttyUSB0 > outputfile.txt

它确实创建了一个名为outputfile.txt 的输出文件,但它没有在其中写入任何内容。

这意味着我根本无法将输出写入文本文件。我应该如何将此输出的前几行写入文件文本文件?

如果无法使用终端,是否可以使用 Python 运行相同的命令并将输出写入文本文件并终止它?

【问题讨论】:

  • 现在,我无法像上面所说的那样写入文件。当我无法理清如何在文件中编写此命令 o/p 时,我想如何控制行数?
  • 当您运行您说您尝试过的命令时,输出会显示在屏幕上吗?因为它看起来应该进入文件,所以问题是如果不在那里,它会去哪里。
  • 我在这里看到了类似的问题:stackoverflow.com/q/8058831/184968。答案 (stackoverflow.com/a/8058922/184968) 说要在 awk 脚本中添加 fflush()
  • 或者你可以试试这个问题的答案:unix.stackexchange.com/questions/25372/…
  • 可能在我之前的示例中将tail 更改为head?但是在 awk 中使用 NR 计数器似乎是最好的方法。祝你好运。

标签: linux bash shell awk


【解决方案1】:

您的输出可能已缓冲,并且您在刷新缓冲区之前停止了代码。通过强制awk 只处理几条记录,它会优雅地退出并写入缓冲的输出。

尝试通过检查记录计数强制awk 处理它遇到的前十个。

stty -F /dev/ttyUSB0 ispeed 4800 &amp;&amp; awk -F"," '/SUF/ and NR &lt; 10 {print $3,$4,$5,$6,$10,$11,substr($2,1,2),".",substr($2,3,2),".",substr($2,5,2)} NR &gt; 9 {exit}' &lt; /dev/ttyUSB0 &gt; outputfile.txt

NR 计算为相对于awk 启动时读取的第一条记录的当前记录号。当NR 大于 9 时,它将退出。如果您希望只打印一次 /SUF/,那么您可以在打印后立即退出。

stty -F /dev/ttyUSB0 ispeed 4800 &amp;&amp; awk -F"," '/SUF/ {print $3,$4,$5,$6,$10,$11,substr($2,1,2),".",substr($2,3,2),".",substr($2,5,2); exit}' &lt; /dev/ttyUSB0 &gt; outputfile.txt

【讨论】:

    【解决方案2】:

    您正在对不断写入的文件运行 awk。您希望 awk 在什么时候停止读取文件?也许你想做的是这样的:

    stty -F /dev/ttyUSB0 ispeed 4800 &&
    cp /dev/ttyUSB0 tmp && 
    awk -F"," '/SUF/ {print $3,$4,$5,$6,$10,$11,substr($2,1,2),".",substr($2,3,2),".",substr($2,5,2)}' tmp
    

    所以您拍摄文件的快照并在其上运行 awk?

    【讨论】:

    • 我希望我的代码在将 10 个输出写入文件后停止运行,或者即使只有 1 个也可以完成这项工作。您的代码旨在将文件中的内容复制到一个名为“tmp”的新文件中,然后对其应用 awk。但它并没有按照您的预期做......它只是将内容从 /dev/ttyUSB0 复制到 tmp 并且没有将 awk 应用于它,我必须使用 CTRL+C
    • 如果您希望 awk 在处理 10 行后停止运行,只需添加一行 NR==10{exit} 即可。
    猜你喜欢
    • 2010-11-03
    • 1970-01-01
    • 2018-06-17
    • 2011-01-28
    • 2023-03-26
    • 2020-08-28
    • 1970-01-01
    • 1970-01-01
    • 2013-01-17
    相关资源
    最近更新 更多