在具有两个分隔符的文件中搜索值

时间:2018-02-20 10:38:47

标签: linux bash shell awk

我有以下格式的数据文件

1|col2|col3|105,230,3,44,59,62|col5
2|col2|col3|43,44|col5
3|col2|col3|1,2,3,4,5,6,7,8|col5
4|col2|col3|1,2,37|col5
  • 分隔符是“|”
  • 第4列是逗号分隔的数字。
  • 我需要在第4栏中单独编号为“3”的记录,但不应计算43或33等数字。
  • “3”可以在第4列的开头,第4列的中间或第4列的末尾

因此,上述给定数据的理想记录是

1|col2|col3|105,230,3,44,59,62|col5
3|col2|col3|1,2,3,4,5,6,7,8|col5

我目前正在使用以下命令,但我正在寻找更有效/有组织的一个

awk -F"|" '$4 ~ /,3,/ || $4 ~ /^3,/ || $4 ~ /,3$/'

3 个答案:

答案 0 :(得分:5)

短GNU this.fetchProductSubscription = this.fetchProduct$.subscribe(result => this.someFn(value)); 解决方案:

awk
  • awk -F'|' '$4 ~ /\<3\>/' file \< - 分别代表开始结束

输出:

\>

或更统一/便携的:

1|col2|col3|105,230,3,44,59,62|col5
3|col2|col3|1,2,3,4,5,6,7,8|col5

答案 1 :(得分:2)

如果您希望第4列中包含3的任何值,则打印该行,如果是,则awk之后可以帮助您:

awk -F"|" '{num=split($4, array,",");for(i=1;i<=num;i++){if(array[i]==3){print;next}}}'   Input_file

答案 2 :(得分:0)

有一种惯用的方法来处理使用GNU awk将字段拆分为子字段(尽管在此上下文中它是过度的)。基本流程如下:

  1. 保存当前记录rec = $0
  2. 保存当前字段分隔符oFS = FS
  3. 选择新的字段分隔符FS=","
  4. $0设置为您感兴趣的字段$0 = $4
  5. 您现在可以使用美元符号等来处理子字段。
  6. 恢复原始字段分隔符FS = oFS
  7. 例如:

    parse.awk

    BEGIN { FS = "|" }
    
    { rec = $0 }
    
    { 
      oFS = FS
      FS  = ","
      $0  = $4
    }
    
    /\<3\>/ { 
      print rec
    }
    
    { FS = oFS }
    

    像这样运行:

    awk -f parse.awk infile
    

    输出:

    1|col2|col3|105,230,3,44,59,62|col5
    3|col2|col3|1,2,3,4,5,6,7,8|col5