繁体   English   中英

AWK和多个空格(列分隔符)

[英]AWK and multiple spaces (column delimiters)

大家,早安,

要使用发布者软件中的数据,我具有一些可通过CLI(Linux Shell)调用的功能。

其中之一以以下格式将数据返回给我:

2601424 OPTDCBO3 EERP O 0254  5512240 TDCTAC01 B                 00 0000000 N  N
2602451 WHA      EERP O 0254  5512353 03ZEE003 B                 00 0000000 N  N
2602748 OPTDCBO4 EERP O 0254  5512380 TDCTAC01 B                 00 0000000 N  N
2603290 OPTDCBO3 EERP O 0254  5512440 TDCTAC01 B                 00 0000000 N  N
2604594 OPTDCBO3 EERP O 0254  5512560 TDCTAC01 B                 00 0000000 N  N
2605631 OP49LDB1 TRAN O 0254          EDRZZZ02 B     2605627-EDR 00 0000000 N  N
2605657 OP49LDB1 TRAN O 0254          EDRZZZ02 B     2605652-EDR 00 0000000 N  N
2605663 OP49LDB1 TRAN O 0254          EDRZZZ02 B     2605653-EDR 00 0000000 N  N
2606116 OPTDCBO3 EERP O 0254  5513080 TDCTAC01 B                 00 0000000 N  N
2716077 OPTDCBO3 EERP O 0255  5610080 TDCTAC01 B                 00 0000000 N  N
2716564 SOG01    TRAN O 0255 s2716564 TACSOG01 B     2716504-TAC 00 0000000 N  N
2718631 OPTDCBO3 EERP O 0255  5610160 TDCTAC01 B                 00 0000000 N  N
7158273 OPTDCBO4 EERP O 0251  5203300 TDCTAC01 B                 00 0000000 N  N
7158672 WHA      EERP O 0251  5203342 03ZEE001 B                 00 0000000 N  N
7158939 ZZZA4    LIST O 0251                   B     7158938-49W 00 0000000 N  N
7158978 OPTDCBO3 EERP O 0251  5203400 TDCTAC01 B                 00 0000000 N  N
7159853 OPTDCBO4 EERP O 0251  5203540 TDCTAC01 B                 00 0000000 N  N
2724704 SOU02    TRAN I 0255 s2724704 FTP_B    E     2724704-SOU 00 0000000 N  N
2724707 PRODS2I  EERP O 0255  6219255 S2IRCE03 E                 00 0000000 N  N
2724708 SOU01    TRAN I 0255 s2724708 FTP_B    E     2724708-SOU 00 0000001 N  N
2724709 SON01    TRAN O 0255 s2724709 SOUSON11 E     2724708-SOU 00 0000001 N  N

在上面的示例中,我尝试收集了所有可能遇到的情况,但是即使它并不详尽,我所寻求的帮助也可以帮助我解决问题:)

我的命令返回以上面的格式按列显示数据,中间有一个空格分隔前5列,一个或两个空格(取决于大小写)分隔第5列和第6列。 有时第6列和第7列完全为空。

目的是能够在正确分隔的文本文件中返回部分或全部这些数据(例如,每个字段之间用逗号分隔)。

今天,如果要检索第一列和第七列,请使用以下命令:

command | awk -F" " '{ print $1,$7 }'

但是,当然,它给了我这样的结果:

2603290 TDCTAC01
2604594 TDCTAC01
2605631 B
2605657 B
2605663 B
2606116 TDCTAC01
2606214 TDCTAC01
7158672 03ZEE001
7158939 7158938-49W
7158978 TDCTAC01

Awk将充满空格的列视为大量相邻的分隔符,而不是“空”列,因此将返回下一个非空列的数据。

您是否有解决方案,可以将多个X空间的序列视为一个空列,同时管理有时会有两个空间来分隔两列的事实?

注意: N°6列可以由1到6个数字字符组成,因此您不能简单地使用固定宽度来定界列。

谢谢!

wrt Column N°6 can be composed of 1 to 6 numeric characters, so you cannot simply use a fixed width to delimit the column. - 你当然可以。 该列的宽度固定为8个字符的宽度(或9个字符以懒惰地包含分隔符空间)-使用该列并修剪前导/后缀空白( gsub(/^ +| +/,"",$6) )到留下您感兴趣的价值。

这是使用FIELDWIDTHS进行FIELDWIDTHS识别所有字段的方法(与其他awk一起需要while(substr())循环):

awk -v FIELDWIDTHS="7 9 5 2 5 9 9 2 16 3 8 2 3" '
{
    print "----"
    print $0
    for (i=1;i<=NF;i++) {
        gsub(/^ +| +$/,"",$i)
        print i, "<" $i ">"
    }
}
' file

例如:

$ cat file
2602451 WHA      EERP O 0254  5512353 03ZEE003 B                 00 0000000 N  N
2605657 OP49LDB1 TRAN O 0254          EDRZZZ02 B     2605652-EDR 00 0000000 N  N
2724704 SOU02    TRAN I 0255 s2724704 FTP_B    E     2724704-SOU 00 0000000 N  N

$ awk -v FIELDWIDTHS="7 9 5 2 5 9 9 2 16 3 8 2 3" '{ print "----"; print $0; for (i=1;i<=NF;i++) {gsub(/^\s+|\s+$/,"",$i); print i, "<" $i ">"} }' file
----
2602451 WHA      EERP O 0254  5512353 03ZEE003 B                 00 0000000 N  N
1 <2602451>
2 <WHA>
3 <EERP>
4 <O>
5 <0254>
6 <5512353>
7 <03ZEE003>
8 <B>
9 <>
10 <00>
11 <0000000>
12 <N>
13 <N>
----
2605657 OP49LDB1 TRAN O 0254          EDRZZZ02 B     2605652-EDR 00 0000000 N  N
1 <2605657>
2 <OP49LDB1>
3 <TRAN>
4 <O>
5 <0254>
6 <>
7 <EDRZZZ02>
8 <B>
9 <2605652-EDR>
10 <00>
11 <0000000>
12 <N>
13 <N>
----
2724704 SOU02    TRAN I 0255 s2724704 FTP_B    E     2724704-SOU 00 0000000 N  N
1 <2724704>
2 <SOU02>
3 <TRAN>
4 <I>
5 <0255>
6 <s2724704>
7 <FTP_B>
8 <E>
9 <2724704-SOU>
10 <00>
11 <0000000>
12 <N>
13 <N>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM