嗨,我需要重新排列我使用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
这是awk
命令将达到您的目标,
$ awk '{if($0 ~ /C1/){match($0,/C1;[^ ]+/);print substr($0,RSTART,RLENGTH)} else print ""}' file
C1;5673
C1;52134
C1;5513
简短说明,
-
if($0 ~ /C1/)
:查找记录包括C1 -
match($0,/C1;[^ ]+/)
:找到图案符合正则C1;[^ ]+
,起点将存储在rstart中,长度将以rllength为单位 -
substr($0,RSTART,RLENGTH)
:从RSTART
打印子弦启动,长度为RLENGTH
短 gawk 解决方案:
awk -v FPAT='C1;[0-9]+' '{ print $1 }' file
输出:
C1;5673
C1;52134
C1;5513
-
-v FPAT='C1;[0-9]+'
-模式,定义字段值
awk '$0 !~ /C1/ {$0 = ""} {match($0,/C1;[^ ]+/);print substr($0,RSTART,RLENGTH)}' file
- 在行中不存在C1并分配$ 0 =" 时检查情况
- 如果存在模式,我们将转到下一个块并进行处理以提取和打印C1子字符串。
输出:
C1;5673
C1;52134
C1;5513
输入
$ 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