找回密码
 注册
查看: 399|回复: 0

awk 统计字符个数

[复制链接]

1

主题

0

回帖

12

积分

管理员

积分
12
QQ
发表于 2023-6-17 08:19:29 | 显示全部楼层 |阅读模式
在每个 Unix 机器上的任何 shell 中使用任何 awk:7 P6 T7 t" B' b

8 w8 ~/ X" g/ [4 x  W$ awk 'sub(/^ +/,""){print a[++c] $0; next} {a[NR]=$0}' file
' m5 P; h4 O4 H+ e9 S: o3 Z, }<ma x="1">ab</ma><r x="1">0</r>
( Z6 M9 R" R4 Y, j<ma x="2">af</ma><r x="2">0</r>5 t. w) i0 A( y6 H6 F6 x+ H  C
<ma x="3">ji</ma><r x="3">0</r>
+ K' `# z( l- e  ~- d3 `如果前导空格实际上是制表符,则将 ^ + 替换为 ^\t+。如果它可以是两者的混合,则在 POSIX awk 中使用 ^[[:space:]]+ 或在任何 awk 中使用 ^[ \t]+。
* L6 ^6 T  N% @/ D5 ?+ o# z$ G. ?0 Q) v
. K! i* F. {( f6 v) B3 g* o,
8 l$ Y, j, ~; {3 d0 X& r% N7 q4 {这对你有用吗?
; Z. S/ c, d  m8 b+ Q( D! ?* i: u1 t4 |3 U' d) B) e* F! \
此处 rows 是文件名....0 a. s, c9 n7 f) T. K9 c8 G3 q

! N) Z+ N5 D$ w/ X/ H1 Uawk '{m=gensub(/.+ (x="[^"]+).*/,"\\1","1",$0);gsub(/^ +/,"",$0);a[m]=a[m] $0}END{for(i in a){print a[i]}}' rows0 B  t8 ]# U+ ^: T" @/ J
<ma x="1">ab</ma><r x="1">0</r>1 L* _6 N; h/ |% x0 e2 Y
<ma x="2">af</ma><r x="2">0</r>
1 g" ]; `+ |  A' z3 l+ ?# k<ma x="3">ji</ma><r x="3">0</r>
& ^) B: |3 |6 ~6 ]我们找到变量定义 x="??"并将其存储在 m 中;我们剥离前导空白;我们将整行分配给基于 m 的数组;然后我们遍历数组并打印它。
0 X: Q; v* [- C, U9 S; x4 A; `. ~1 b: z1 E8 u$ x7 Y7 b
注意:gensub 是特定于 GNU awk 的非 posix 扩展。 并且 awk 散列数组不能保证保持顺序;以上复制粘贴的输出顺序正确纯属巧合。
, `0 k4 ^2 F: C4 h! }( E
4 ^) h3 a8 O2 ^' N2 s! h; B,
. [, k- t% q8 tlastline=$(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
) t0 D5 o2 X7 p* X考虑到 x 值按行顺序递增,我只并排打印文件的前半部分和后半部分,而不是存储和匹配 x 值。
$ E0 W6 H( f3 Q' e* G' D. f- {: L. ~& |! O% r
wc -l 是获取行数,在本例中为 6,因此文件行被拆分为 3 - 3 内的 awk
2 I6 M/ H2 A$ y  y% y  }: E' k  X! I9 u" e! o
您需要登录后才可以回帖 登录 | 注册

本版积分规则

返回首页|Archiver|手机版|小黑屋|易陆发现技术论坛 ( 蜀ICP备2026014127号-1 )

GMT+8, 2026-6-12 00:47 , Processed in 0.013587 second(s), 23 queries .

Powered by Discuz! X5.0

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表