|
|
在每个 Unix 机器上的任何 shell 中使用任何 awk:
3 Y% Y j9 ^! E7 {! r% c5 n9 k" Y' v7 ~3 W) U/ s3 A' w
$ awk 'sub(/^ +/,""){print a[++c] $0; next} {a[NR]=$0}' file: E+ [9 H2 i$ v) {) }% Q
<ma x="1">ab</ma><r x="1">0</r>2 u1 W s) N6 o, M) A
<ma x="2">af</ma><r x="2">0</r>* [$ u+ Y& _( D3 P
<ma x="3">ji</ma><r x="3">0</r># J7 d' j3 k n. @7 ], y
如果前导空格实际上是制表符,则将 ^ + 替换为 ^\t+。如果它可以是两者的混合,则在 POSIX awk 中使用 ^[[:space:]]+ 或在任何 awk 中使用 ^[ \t]+。& W8 N9 {3 A2 K& ]
0 G9 Q6 p" g1 |( y$ V) N! f4 n
,2 d2 L$ _4 r* j" L& Y
这对你有用吗?2 @& S( c; i3 Y$ i% v/ ~
( ?5 _8 z/ s' u0 E3 ~
此处 rows 是文件名....
* L5 G8 q+ I: K5 `! j; ]4 }5 p L" f9 V$ v- z" \6 _
awk '{m=gensub(/.+ (x="[^"]+).*/,"\\1","1",$0);gsub(/^ +/,"",$0);a[m]=a[m] $0}END{for(i in a){print a[i]}}' rows
7 G% h& l: o9 V# I5 u$ p<ma x="1">ab</ma><r x="1">0</r>0 b- T$ {2 v9 J" H0 G$ l
<ma x="2">af</ma><r x="2">0</r>' p: R# H X! e5 n0 L5 B
<ma x="3">ji</ma><r x="3">0</r>
( \+ @$ m" g6 ]" R; `2 h" M我们找到变量定义 x="??"并将其存储在 m 中;我们剥离前导空白;我们将整行分配给基于 m 的数组;然后我们遍历数组并打印它。
/ e- Q6 P0 e% n) B4 I$ ]" o* i2 N/ h" T- T$ W- Y# h" z5 p+ v
注意:gensub 是特定于 GNU awk 的非 posix 扩展。 并且 awk 散列数组不能保证保持顺序;以上复制粘贴的输出顺序正确纯属巧合。
, o0 \! h% H4 y6 s5 ^7 f1 b: N% s3 P: X% i: D& c
,
+ c1 W9 j/ r/ K* T6 e4 B# nlastline=$(wc -l < log) | awk -F'"' -v line=$lastline '{ if(NR<=line/2) arr[NR]=$0; gsub(/^ +/,$0); if(NR>line/2) print arr[NR-line/2] $0}' log: v& h8 \: y3 h
考虑到 x 值按行顺序递增,我只并排打印文件的前半部分和后半部分,而不是存储和匹配 x 值。
( R9 k" o1 o. t+ m' |) y8 L- a0 M! a8 |# d
wc -l 是获取行数,在本例中为 6,因此文件行被拆分为 3 - 3 内的 awk3 A9 ^) i. z* v% V# E
|- V u/ B2 G' \1 z |
|