输入.txt
abc1 abc2 {"request":{"jjj":"opt1"},"user":{"name":"abc5"}}
xyz1 xyz2 {"request":{"xyz3":{"xyz4":{"xyz5":"xyz6"}},"jjj":"opt2"}}
ghi1 ghi2 {"request":{"ghi3":{"ghi4":{"ghi5":"ghi6"}},"jjj":"opt3"},"user":{"ghi7":"value"}}
需要输出如前两个字段和匹配字符串后的单词jjj
abc1 abc2 opt1
xyz1 xyz2 opt2
aaa1 aaa2 opt3
答案1
如果您能够使用sed
,则可以使用正则表达式从第三列中提取必要的部分,同时保持其余部分不变。
sed 's/{.*"jjj":"\([^"]*\).*$/\1/g' input.txt
我的input.txt
文件包含:
abc1 abc2 {"abc3":{"jjj":"opt1"}}
xyz1 xyz2 {"xyz3":{"jjj":"opt2"}}
aaa1 aaa2 {"aaa3":{"aaa4:"jjkk"},.....{"jjj":"opt3"}}
在这里,我试图捕获下"jjj":"
一个结束双引号前后双引号中存在的值。
答案2
$ awk '
{
print $1, $2, \
substr($0, 8+match($0, /\{"jjj":"[^"]+"/), RLENGTH-9)
}' input.txt
abc1 abc2 opt1
xyz1 xyz2 opt2
aaa1 aaa2 opt3
答案3
由于您的第三个字段似乎是有效的 JSON,因此您可以考虑使用以下命令jq
:
$ awk -v cmd='jq -r ".. | .jjj? // empty"' '
{printf "%s%s%s%s",$1,OFS,$2,OFS; print $3 | cmd; close(cmd)}
' file
abc1 abc2 opt1
xyz1 xyz2 opt2
ghi1 ghi2 opt3
答案4
假设文件的三个字段都是制表符分隔的:
$ cut -f 3 file | jq -r '.request.jjj' | paste <( cut -f -2 file ) -
abc1 abc2 opt1
xyz1 xyz2 opt2
ghi1 ghi2 opt3
这会提取每行第三个字段中的 JSON 结构,并将它们传递给以jq
提取每个字段中键的值.request.jjj
。然后使用 将该数据粘贴回第三列paste
。
如果数据由单个空格字符分隔:
$ cut -d ' ' -f 3- file | jq -r '.request.jjj' | paste -d ' ' <( cut -d ' ' -f -2 file ) -
abc1 abc2 opt1
xyz1 xyz2 opt2
ghi1 ghi2 opt3
cut
请注意,需要使用第一个提取 JSON 结构的方法-f 3-
,而不仅仅是-f 3
确保没有嵌入的空格字符会截断数据。