我有一个文件包含如下数据。我想剪切第一列和最后一列并存储在变量中。 我可以使用命令"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
光辉 1293686 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
制造 14414 1659 1833
伯恩再次壳牌 32 532 469 1830
JavaScript 10204 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 不在乎,除非你告诉它,外壳也不在乎。