awk参数在文件中打印特定匹配值

时间:2017-06-27 10:07:03

标签: awk

您好我需要使用awk重新排列我拥有的数据文件。以下是我的数据:

A1;1234 B1;4556 C1;5673 D1;0987
A1;1524 B1;8545 D1;81535
A1;2035 C1;52134 D1;95412
B1;5135 C1;5513 D1;5722

如果我只打印仅包含C1的字段上的数据;我怎么能在awk上做到?

预期产出:

C1;5673
              <------ "This line is really blank since there is no C1;
C1;52134
C1;5513

4 个答案:

答案 0 :(得分:0)

这是awk命令可以达到你的目标,

$ awk '{if($0 ~ /C1/){match($0,/C1;[^ ]+/);print substr($0,RSTART,RLENGTH)} else print ""}' file
C1;5673

C1;52134
C1;5513

简要说明,

  1. if($0 ~ /C1/):找到记录包括C1
  2. match($0,/C1;[^ ]+/):找到模式符合正则表达式C1;[^ ]+,起点将存储在RSTART中,长度将在RLENGTH中
  3. substr($0,RSTART,RLENGTH):打印从RSTART开始的子字符串,其长度为RLENGTH

答案 1 :(得分:0)

gawk 解决方案:

awk -v FPAT='C1;[0-9]+' '{ print $1 }' file

输出:

C1;5673

C1;52134
C1;5513
  • -v FPAT='C1;[0-9]+' - 模式,定义字段值

答案 2 :(得分:0)

awk '$0 !~ /C1/ {$0 = ""} {match($0,/C1;[^ ]+/);print substr($0,RSTART,RLENGTH)}' file 
  1. 检查线路中不存在C1并分配$ 0 =&#34;&#34;
  2. 如果模式存在,我们将转到下一个块并进行处理以提取和打印C1子串。
  3. 输出:

    C1;5673
    
    C1;52134
    C1;5513
    

答案 3 :(得分:0)

输入

$ cat file
A1;1234 B1;4556 C1;5673 D1;0987
A1;1524 B1;8545 D1;81535
A1;2035 C1;52134 D1;95412
B1;5135 C1;5513 D1;5722

输出

$ awk '{ print match($0, /C1;[0-9]+/) ? substr($0,RSTART,RLENGTH) : ""}' file
C1;5673

C1;52134
C1;5513