文件内容:
ST*810*1591754~BIG*20180826*00007201948*20180816*8708251***PR~CUR*SE*USD~N1*ST*RENT-A-CENTER #00842*ZZ*00842~N3*801 E. WM. CANNON~N4*AUSTIN*TX*78745*US~N1*BT*RENT-A-CENTER~N3*5501 HEADQUARTERS DR~N4*PLANO*TX*75024*USA~REF*ZA*1527~ITD*ZZ*3*0*20180826*0*20180925*30*000****Net 30 Days~DTM*011*20180826~FOB*PP*ZZ*AUSTIN, TX 78745~IT1*4*1*EA*273.00*QR*IN*100023757*VP*M84241~IT1*1*3*EA*90.66*QR*IN*100023415*VP*M91X42~IT1*2*1*EA*560.82*QR*IN*100022553*VP*3220217/66~TDS*110580~ISS*5*EA~SE*19*1591754~
输出:
filename,00007201948,8708251,1527
' * ' 分隔文件是内容。BIG 是我的关键字之一,“BIG*20180826*00007201948*20180816*8708251*”,我需要一个命令来打印 'filename,00007201948,8708251,1527',grep 关键字 'BIG' 并需要打印第 2 到第 3 个星号和第 4 到第 5 个星号之间的数据。而“REF*ZA*1527~”'ZA' 是另一个关键字,用于获取星号 (*) 之间的下一个字符以倾斜 (~)。
答案1
使用 awk:~
用作记录分隔符并且*
作为字段分隔符:
awk -F'*' -v RS='~' -v OFS=, '
$1 == "BIG" {a = $3; b = $5}
$2 == "ZA" {c = $3}
END {print FILENAME, a, b, c}
' file
请注意,awk 查看文件的方式如下:
$ awk -v RS='~' -F'*' '{print NR, NF, $0}' file
1 3 ST*810*1591754
2 8 BIG*20180826*00007201948*20180816*8708251***PR
3 3 CUR*SE*USD
4 5 N1*ST*RENT-A-CENTER #00842*ZZ*00842
5 2 N3*801 E. WM. CANNON
6 5 N4*AUSTIN*TX*78745*US
7 3 N1*BT*RENT-A-CENTER
8 2 N3*5501 HEADQUARTERS DR
9 5 N4*PLANO*TX*75024*USA
10 3 REF*ZA*1527
11 13 ITD*ZZ*3*0*20180826*0*20180925*30*000****Net 30 Days
12 3 DTM*011*20180826
13 4 FOB*PP*ZZ*AUSTIN, TX 78745
14 10 IT1*4*1*EA*273.00*QR*IN*100023757*VP*M84241
15 10 IT1*1*3*EA*90.66*QR*IN*100023415*VP*M91X42
16 10 IT1*2*1*EA*560.82*QR*IN*100022553*VP*3220217/66
17 2 TDS*110580
18 3 ISS*5*EA
19 3 SE*19*1591754
20 1
第 20 条记录包含 1 个字段,即文件末尾的换行符。