【问题标题】:Print number of lines matching conditions in files generated by count打印count生成的文件中匹配条件的行数
【发布时间】:2018-08-17 23:32:34
【问题描述】:

我试图弄清楚如何使用纯 awk 打印满足 bash 中 while 计数 循环提供的计数的行。这是输入的一些行。

NODE_1_posplwpl
NODE_1_owkokwo
NODE_1_kslkow
NODE_2_fbjfh
NODE_2_lsmlsm
NODE_3_Loskos
NODE_3_pospls

我想要做的是将在第二个字段中与 while count 循环提供的计数匹配的行打印到名为 file_$count_test 的文件中。 因此,名为“file_1_test”的文件将包含带有“NODE_1..”的行,“file_2_test”将包含带有“NODE_2..”的行;就像文件的所有行一样。 这是我的代码。

#! /bin/bash

while read CNAME
do
    let count=$count+1
    grep "^${CNAME}_" > file_${count}_test
    awk -v X=$count '{ FS="_" } { if ($2 == X) print $0 }' > file_${count}_test
done <$1
exit 1

此代码仅创建文件_1_test,它是空的。所以 awk 条件似乎不好用。

【问题讨论】:

  • 请在您的帖子中的代码标签中发布示例输入,不建议提供示例输入和输出的链接。
  • 只提供了输入的一些行。
  • 这里不需要使用while 循环,如果您能告诉我们您要做什么,那么我们可以在单个awk 本身中完成。请立即在您的帖子中添加该逻辑。

标签: linux bash awk while-loop


【解决方案1】:

看起来您正在尝试将输入拆分为根据下划线之间的数字命名的单独文件。那就是:

awk -F'_' '{print > ("file_" $2 "_test")}' file

您可能需要将其更改为:

awk -F'_' '$2!=prev{close(out); out="file_" $2 "_test"} {print > out; prev=$2}' file

如果您生成大量输出文件而不使用 GNU awk,因为这可能会导致“打开的文件过多”错误。

把你的cmets写在下面,看:

$ cat file
NODE_1_posplwpl
NODE_1_owkokwo
NODE_1_kslkow
NODE_2_fbjfh
NODE_2_lsmlsm
NODE_3_Loskos
NODE_3_pospls

$ awk -F'_' '{print $0 " > " ("file_" $2 "_test")}' file
NODE_1_posplwpl > file_1_test
NODE_1_owkokwo > file_1_test
NODE_1_kslkow > file_1_test
NODE_2_fbjfh > file_2_test
NODE_2_lsmlsm > file_2_test
NODE_3_Loskos > file_3_test
NODE_3_pospls > file_3_test

只需将$0 " &gt; " 更改为&gt;,就像在第一个脚本中一样,让输出转到单独的文件,而不是像最后一个脚本那样只显示会发生这种情况。

【讨论】:

  • 这些文件需要包含与下划线之间的数字匹配的每一行。
  • 是的,这就是我的假设。你试过了吗?如果它没有达到您想要的效果,请编辑您的问题以阐明您想要什么并提供预期的输出。不要只描述预期的输出 - 显示预期的输出。
  • 提供的命令将输入​​文件的所有内容打印到一个文件中。
  • 不,它没有。当然,除非您的输入看起来不像您向我们展示的输入。
  • 我需要将它集成到while循环中吗?单独使用它会产生一个输出文件。
猜你喜欢
  • 1970-01-01
  • 2011-03-26
  • 1970-01-01
  • 1970-01-01
  • 2021-11-26
  • 2014-12-03
  • 2016-10-22
  • 1970-01-01
  • 2018-01-02
相关资源
最近更新 更多