使用 AWK 提取和存储具有不均匀空间的字符串



我有一个文件包含如下数据。我想剪切第一列和最后一列并存储在变量中。 我可以使用命令"awk -F" {2,}" '{print $1,$NF}' filename.txt"打印它,但我无法使用awk -v命令将其存储在变量中。

主要问题是第一列在单词之间包含空格,如果我使用awk -v命令,awk将其视为 3 列。

请建议我如何实现这一目标。


XML 2144 11270 2846 3385074

爪哇 7356 272651 242949 1350596

C++ 671 46497 42702 179366

C/C++ 标头 671 16932 57837 44248

XSD 216 3131 807 27634

光辉 129

3686 4279 12431

IDL 90 1098 0 8697

Perl 17 717 795 5698

蟒蛇 37 1102 786 4640

蚂蚁 62 596 154 4015

XSLT 18 117 13 2153

制造 14

414 1659 1833

伯恩再次壳牌 32 532 469 1830

JavaScript 10

204 35 1160

CSS 5 95 45 735

技能 2 77 0 523

HTML 11 70 49 494

SQL 9 39 89 71

C 壳 3 13 25 31

D 1 5 15 10

总额: 11498 359246 355554 5031239

在执行 awk 代码之前计算-v VAR=value参数。它实际上不是代码的一部分,因此您无法引用字段,因为它们尚不存在。相反,请在代码中设置变量:

awk '{ Lang=$1; Last=$NF; print Lang, Last; }'

此外,在awk中设置这些变量不会影响bash的变量。环境是分层的 - 每个子环境从父环境继承某种状态,但它永远不会向上流动。从子级获取状态的唯一方法是让子级以父级可以处理的格式打印状态。例如,您可以将上述命令通过管道传输到while read LANG LAST; do ...; done将 awk 输出读取到变量中。

从您的评论来看,您似乎试图以一种不太有意义的方式混合 awk 和 shell。因此,正确的完整代码(用于在 bash 循环中获取变量(将是:

cat loc.txt | awk '{ Lang=$1; Last=$NF; print Lang, Last; }' | while read LANG LAST; do ...; done

或者,如果是固定数量的字段,则可以完全跳过awk:

cat loc.txt | while read LANG _ _ _ _ LAST; do ...; done

其中"_"仅表示创建并忽略的变量。在某些编程语言中,下划线表示占位符是一种约定,在这种情况下,它实际上是一个可以用echo $_打印的变量。如果你关心中间值,你可以给它一个真实的名字,并以不同的方式命名每个字段。

这些解决方案都不关心有多少空白。Awk 不在乎,除非你告诉它,外壳也不在乎。

最新更新