awk:如何从固定长度文件中选择多个子字符串?

awk:如何从固定长度文件中选择多个子字符串?

我已经搜索了又搜索,但还没有真正找到这个问题的答案。我的想法是,我有一个 dat 文件,需要其中的一些数据字段。

示例数据(test.dat)

50DI 20170510144200Mike   Tester       BL0004992000US
50ELI20170509145200Roy    Developer    BL0003400020MX

因此,如果我希望第二个数据字段从位置 3(DI 或 ELI)开始,长度为 3,我会这样做:

awk '{print substr($0,3,3)}' test.dat

但我不知道如何从原始 dat 文件中获取多个数据字段。我想出的最好的就是这个(在复制旧版本时进行编辑)。

#!/bin/bash

for i in {1..1}; do
    a=$(awk '{print substr($0,0,2)}' test.txt)
    b=$(awk '{print substr($0,20,7)}' test.txt)
    echo $a, $b
done

结果为

50 50, Mike Roy

代替

50, Mike
50, Roy

这个例子有点基本,但想法保持不变:如何使用 awk 获取多个子字符串? (免责声明:我并没有与 awk 结婚,我只是想用它变得更好。任何其他解决方案也受到高度赞赏!)

答案1

使用 GNU awk,假设您确实想要固定宽度:

awk -v FIELDWIDTHS='2 17 7' -v OFS=', ' '{ print $1, $3 }' test.dat

bash

while read -r line; do
    printf '%s, %s\n' "${line:0:2}" "${line:19:7}"
done <test.dat

有点现代sed

sed 's/^\(..\).\{17\}\(.\{7\}\).*/\1, \2/' test.dat

perl

perl -lpe '$_ = join ", ", unpack "A2x17A7"' test.dat

对于以上任一情况,输出:

50, Mike
50, Roy

答案2

怎么样cut

cut -c1-2,20-26 --output-delimiter ', ' test.dat
50, Mike
50, Roy

答案3

短的sed方法:

sed -En 's/^(.{2}).{17}(\S+).*/\1, \2/gp' test.dat

输出:

50, Mike
50, Roy

相关内容