提取物使用AWK

时间:2017-08-23 05:22:09

标签: linux awk

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

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

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

XML 2144 11270 2846 3385074

Java 7356 272651 242949 1350596

C ++ 671 46497 42702 179366

C / C ++ Header 671 16932 57837 44248

XSD 216 3131 807 27634

Korn Shell 129 3686 4279 12431

IDL 90 1098 0 8697

Perl 17 717 795 5698

Python 37 1102 786 4640

Ant 62 596 154 4015

XSLT 18 117 13 2153

制作14 414 1659 1833

Bourne Again Shell 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 Shell 3 13 25 31

D 1 5 15 10

SUM:11498 359246 355554 5031239

1 个答案:

答案 0 :(得分:0)

在执行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并不关心,而且shell也没有。

相关问题