日期:2014-05-16  浏览次数:20955 次

关于awk打印包含指定字符的列的问题
各位大侠,

现有一文本,text.dat内容如下,各行由“;”分为若干列,
TimTec_ST50577239;Vitas-M_STK856523;Asinex_BAS-24803661;Pharmeks_P2001S-339938
TimTec_ST50576237;Vitas-M_STK856618;Asinex_BAS-24803660;Pharmeks_P2001S-341437
TimTec_ST50575315;Vitas-M_STK621710;Asinex_ASN-06482149;Pharmeks_P2001S-337087
TimTec_ST50572216;Vitas-M_STK622317;Asinex_ASN-06482127;Pharmeks_P2001S-337984
Vitas-M_STK621848;Asinex_ASN-06482126;Pharmeks_P2001S-337283
TimTec_ST51115902;Asinex_LMK-13270402
Asinex_ADM-12434671
TimTec_ST51104507;Asinex_ART-20279362
TimTec_ST51100194;Asinex_AOP-13139439
Asinex_LMK-14224870

现在想把含有字符“Asinex"的列打印出来,并添加行号,自己写了一个awk命令,大体能完成预期要求。
awk '{FS = ";"}{for (f=1; f <= NF; f+=1) {if ($f ~ /Asinex/) {print NR,$f}}}' text.dat > asinex.dat


1 TimTec_ST50577239;Vitas-M_STK856523;Asinex_BAS-24803661;Pharmeks_P2001S-339938
2 Asinex_BAS-24803660
3 Asinex_ASN-06482149
4 Asinex_ASN-06482127
5 Asinex_ASN-06482126
6 Asinex_LMK-13270402
7 Asinex_ADM-12434671
8 Asinex_ART-20279362
9 Asinex_AOP-13139439
10 Asinex_LMK-14224870
发现第一行好像没有执行,if 语句。

如果把if 语句里的/Asinex/换为/^Asinex/
2 Asinex_BAS-24803660
3 Asinex_ASN-06482149
4 Asinex_ASN-06482127
5 Asinex_ASN-06482126
6 Asinex_LMK-13270402
7 Asinex_ADM-12434671
8 Asinex_ART-20279362
9 Asinex_AOP-13139439
10 Asinex_LMK-14224870
第一行干脆没有被打印,很奇怪不明白为什么,
希望了解的朋友指点一下。
谢谢。
------解决方案--------------------
引用
有没有办法把一行中含有多个“Asinex”条目的内容,在输出文件里也打印在同一行?

awk 'BEGIN{FS = ";"}{n=0;for (f=1; f <= NF; f+=1) {if ($f ~ /Asinex/){if(n==0){printf "%d %s",NR,$f;n=1}else{printf ";%s",$f}}}print""}' text.dat > asinex.dat