免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3313 | 回复: 6
打印 上一主题 下一主题

[文本处理] awk如何根据第一个field提取某些行 [复制链接]

论坛徽章:
2
摩羯座
日期:2014-10-28 18:18:322015元宵节徽章
日期:2015-03-06 15:52:30
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-10-28 17:38 |只看该作者 |倒序浏览
文件格式为
1 *** ***
2 *** ***
3 *** ***
4 *** ***




我写了个脚本
numlist="1 3 10"
for n in ${numlist}
do
    # 在这里提取1 3 10的行,该如何做
    awk -v N=$n '$N==$n {..}'   # 这样不行,不知道该怎么做
done

谢谢。

论坛徽章:
6
羊年新春福章
日期:2015-03-03 17:16:28双子座
日期:2015-03-03 17:16:56巳蛇
日期:2015-03-03 17:17:2415-16赛季CBA联赛之福建
日期:2016-03-11 09:05:00黑曼巴
日期:2016-07-07 16:58:1215-16赛季CBA联赛之吉林
日期:2016-11-14 09:23:07
2 [报告]
发表于 2014-10-28 18:01 |只看该作者
  1. #!/bin/bash
  2. for i in 1 3 10
  3. do
  4.         test=`awk 'NR=='$i'{print}' test`
  5.         echo $test
  6. done
复制代码

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
3 [报告]
发表于 2014-10-28 18:07 |只看该作者
回复 1# sophistcxf

awk -vN=$n '$1==N' urfile

不过感觉这样做效率不大好,只要遍历一次文件的事结果
遍历了n次,建议把想要输出的数字放到一个文件里.
   

论坛徽章:
2
摩羯座
日期:2014-10-28 18:18:322015元宵节徽章
日期:2015-03-06 15:52:30
4 [报告]
发表于 2014-10-28 18:12 |只看该作者
回复 2# jcdiy0601


   我举的例子有歧义,文件应该是:

var1 *** ***
var2 *** ***
var3 *** ***
.
.
.
然后提取出var1,var3,var10,var.并没有递增的关系。

论坛徽章:
2
摩羯座
日期:2014-10-28 18:18:322015元宵节徽章
日期:2015-03-06 15:52:30
5 [报告]
发表于 2014-10-28 18:18 |只看该作者
回复 3# Herowinter


    原来awk里不用再加$符号了。3Q

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
6 [报告]
发表于 2014-10-28 18:46 |只看该作者
回复 5# sophistcxf
用数组的话,好像这样就可以了.

  1. cat test.sh
  2. #!/bin/bash

  3. numlist=(var1 var3)
  4. while read line
  5. do
  6.         if [[ "${numlist[@]}" =~ `echo "$line"|awk '{print $1}'` ]];then
  7.                 echo "$line"
  8.         fi
  9. done <i

  10. ./test.sh
  11. var1 111 ***
  12. var3 333 ***
复制代码
  1. cat i
  2. var1 111 ***
  3. var2 222 ***
  4. var3 333 ***
复制代码

论坛徽章:
780
金牛座
日期:2014-02-26 17:49:58水瓶座
日期:2014-02-26 18:10:15白羊座
日期:2014-04-15 19:29:52寅虎
日期:2014-04-17 19:43:21酉鸡
日期:2014-04-19 21:24:10子鼠
日期:2014-04-22 13:55:24卯兔
日期:2014-04-22 14:20:58亥猪
日期:2014-04-22 16:13:09狮子座
日期:2014-05-05 22:31:17摩羯座
日期:2014-05-06 10:32:53处女座
日期:2014-05-12 09:23:11子鼠
日期:2014-05-21 18:21:27
7 [报告]
发表于 2014-10-28 18:52 |只看该作者
回复 6# Herowinter


这个方法不好,有bug,它只是判断第一列那个字符串是不是数组中的一部分,
当numlist=(var11 var31),还是会输出这两行...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP