输入行:
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
但这不会产生正确的输出。
答案 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
。