我的文件包含如下数据。我想剪切第一个和最后一个列并存储在变量中。我可以使用命令“awk -F" {2,}" '{print $1,$NF}' filename.txt
”打印它,但我无法使用awk -v
命令将其存储在变量中。
主要问题是第一列包含单词之间的空格,awk
如果我使用awk -v
命令,则将其视为3列。
请建议我如何实现这一目标。
答案 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也没有。