我正在试图弄清楚如何使用纯粹的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计数循环提供的计数的行到名为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