关于awk打印包含指定字符的列的问题

Jackyma1981 2014-03-13 04:22:34
各位大侠,

现有一文本,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
第一行干脆没有被打印,很奇怪不明白为什么,
希望了解的朋友指点一下。
谢谢。
...全文
3111 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Jackyma1981 2014-03-20
  • 打赏
  • 举报
回复
谢谢版主耐心指教。
ljc007 2014-03-19
  • 打赏
  • 举报
回复
引用
请问有没有办法用sed或其他方式取出一行中以"Asine"开始“;”结束区域的内容

sed '/^Asine.*;$/!d' a.txt
ljc007 2014-03-19
  • 打赏
  • 举报
回复
引用
有没有办法把一行中含有多个“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
Jackyma1981 2014-03-17
  • 打赏
  • 举报
回复
引用 3 楼 ljc007 的回复:
[quote=引用 2 楼 Jackyma1981 的回复:] 谢谢了,第一个比我的就多了一个BEGIN,原来觉得这个BEGIN可以省略掉,看来想错了。
请点击左上角“结帖”按钮 [/quote] 明白,结贴前再让问个相关问题可否? 就是我要处理的原始文件里,有的一行里含有两个"Asinex_??"的条目,按照上面命令处理后的文件行数会比原始文件行数多出很多,因为原始文件,一行代表一种化合物,处理后的文件行数和原始文件不同一的话,检索的时候就会出问题。 有没有办法把一行中含有多个“Asinex”条目的内容,在输出文件里也打印在同一行? 请问有没有办法用sed或其他方式取出一行中以"Asine"开始“;”结束区域的内容,
ljc007 2014-03-14
  • 打赏
  • 举报
回复
awk 'BEGIN{FS = ";"}{for (f=1; f <= NF; f+=1) {if ($f ~ /Asinex/) {print NR,$f}}}' text.dat > asinex.dat
awk -F ';' '{for (f=1; f <= NF; f+=1) {if ($f ~ /Asinex/) {print NR,$f}}}' text.dat > asinex.dat
ljc007 2014-03-14
  • 打赏
  • 举报
回复
引用 2 楼 Jackyma1981 的回复:
谢谢了,第一个比我的就多了一个BEGIN,原来觉得这个BEGIN可以省略掉,看来想错了。
请点击左上角“结帖”按钮
Jackyma1981 2014-03-14
  • 打赏
  • 举报
回复
引用 1 楼 ljc007 的回复:
awk 'BEGIN{FS = ";"}{for (f=1; f <= NF; f+=1) {if ($f ~ /Asinex/) {print NR,$f}}}' text.dat > asinex.dat
awk -F ';' '{for (f=1; f <= NF; f+=1) {if ($f ~ /Asinex/) {print NR,$f}}}' text.dat > asinex.dat
谢谢了,第一个比我的就多了一个BEGIN,原来觉得这个BEGIN可以省略掉,看来想错了。

19,619

社区成员

发帖
与我相关
我的任务
社区描述
系统使用、管理、维护问题。可以是Ubuntu, Fedora, Unix等等
社区管理员
  • 系统维护与使用区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧