我已经搜索了又搜索,但还没有真正找到这个问题的答案。我的想法是,我有一个 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