如何打印必填字段

时间:2018-12-21 02:29:04

标签: bash awk

输入行:

a b=34 c d="12 34 54" e f=387
a b=12 c z d="89 08 23" e f=321 g=12

我要打印两个字段b和d。
需要的输出就像:

b=34 d="12 34 54"
b=12 d="89 08 23"

我尝试过

awk '{print $2, $4}' filename

但这不会产生正确的输出。

3 个答案:

答案 0 :(得分:2)

A Time_in_GMT Sum Amt 0 0 0 1 2 20 2 1 10 3 1 10 4 0 0 5 0 0 6 0 0 7 0 0 8 0 0 9 0 0 10 0 0 11 0 0 12 0 0 13 0 0 14 0 0 15 0 0 16 0 0 17 0 0 18 0 0 19 0 0 20 0 0 21 0 0 22 0 0 23 0 0 24 0 0 应该在这里工作:

sed

输出:

sed -E -n 's/[^b]*(b=[0-9]+) [^d]*(d=".*") [^bd]*/\1 \2/p' file_name

答案 1 :(得分:2)

如果有gawk 4.0或更高版本,如何使用FPAT
请尝试:

gawk -v FPAT='[^ ]+|\\w+="[^"]+"' '
    {for (i=1; i<=NF; i++) if (match($i, "^(b|d)")) printf("%s ", $i); print ""}
' input.txt

输出:

b=34 d="12 34 54" 
b=12 d="89 08 23" 

FPAT是一个awk变量,是一个正则表达式,用于匹配每个字段的内容,而不是使用字段分隔符来分隔行。

答案 2 :(得分:0)

开箱即用的awk不会解析引用的字段。如果要使用Awk提取带引号的字段,则需要对带引号的字段进行解析。

shell开箱即用,可以很好地解析它们;但您可能要避免将用户输入解析为代码。

如果您可以信任输入(即它来自您完全控制的配置文件),则类似

string='a b=34 c d="12 34 54" e f=387'
eval "$string"

会将其中的所有变量都设置为期望值。

不过,也许您想自己解析该字符串。试试这个:

grepvar () {
    grep -Po "$1"'=\K([^"]+|"[^"]*")'
}
a=$(grepvar "a" filename)
b=$(grepvar "b" <<<"$string")

如果您没有grep -P(这是GNU扩展名),可以使用简单的解决方法。但是您对您的要求没有告诉太多,并且这个问题有很多重复的地方,因此找到适合您的东西应该不难。

如果您只想打印提取的值而对实际值不做任何操作

grep -Eo 'a=([^"]+|"[^"]*")' filename
grep -Eo 'b=([^"]+|"[^"]*")' <<<"$string"

以上显示了如何从名为filename的文件中读取以及如何解析已经包含文本的变量$string<<<“此处字符串”是Bash扩展名,例如与sh