linux - 打印count生成的文件中符合条件的行数

标签 linux bash awk while-loop

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

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

此代码仅创建空的 file_1_test。所以 awk 条件似乎不起作用。

最佳答案

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

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

您可能需要将其更改为:

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

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

在下面写下你的评论,看看:

$ 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 "> " 更改为 > 就像在第一个脚本中一样,让输出转到单独的文件,而不是仅仅向您展示会发生这样的事情最后一个脚本。

关于linux - 打印count生成的文件中符合条件的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49193009/

相关文章:

linux - cmake:如何抑制 "Entering directory"消息?

linux - 使用 C++ 在 Linux 中从 USB 摄像头捕获视频

bash - 计算多个文件中某个字段的唯一出现次数

unix - Awk 和多文件处理可能吗?

regex - 如何用bash中变量的值替换第i行的第j列

c - 有没有一种可移植的方法来管理存储在 Linux 中映射文件中的结构数据,而无需逐字节读取原始数据?

java - 在 Linux 中进行 Mysql 数据库备份显示 java.io.IOException :

arrays - 如何在Linux中使用带有多个变量的for循环

使用 grep 和 awk 的 BASH FOR 循环

r - 命令行 - 适用于 Windows 的 Awk 命令