我如何提取第一列(“”中的第一列)
"xxxxx1" {685a}
"xx2" {bcdd}
"xx3 gsdd" {29a6ff}
"sdsdf xxx" {243b9}
"sdfsdf ccc dd" {c28f2f}
"dsdsf sfsdf" {216e}
"sdfsdfsd" {48530}
"sdfsdff" {9d2afa0n}
"sdfsdfdff sdfs" {d8681a}
"sdfsdsds sdfsdf d" {5b9b8}
"sdfsdfs sdf sdfsdf" {68e08a}
"sdfsdfsdf sdf" {107fa0}
我想要的结果是这样的:
"xxxxx1"
"xx2"
"xx3 gsdd"
"sdsdf xxx"
"sdfsdf ccc dd"
"dsdsf sfsdf"
"sdfsdfsd"
"sdfsdff"
"sdfsdfdff sdfs"
"sdfsdsds sdfsdf d"
"sdfsdfs sdf sdfsdf"
"sdfsdfsdf sdf"
任何想法?
答案1
使用 {
(空格,括号)作为字段分隔符,因为您不关心第二个字段:
$ awk -F ' {' '{print $1}' foo
"xxxxx1"
"xx2"
"xx3 gsdd"
"sdsdf xxx"
"sdfsdf ccc dd"
"dsdsf sfsdf"
"sdfsdfsd"
"sdfsdff"
"sdfsdfdff sdfs"
"sdfsdsds sdfsdf d"
"sdfsdfs sdf sdfsdf"
"sdfsdfsdf sdf"
答案2
如果您只想要每行第一个和最后"
一个双引号字符之间的所有内容,最简单的解决方案可能是使用grep
而不是awk
:
grep -o '".*"' FILENAME
开关-o
允许grep
仅输出匹配的部分,而不是包含匹配的整行。(单引号,以防止 shell 解释)模式".*"
匹配任何字符 ( ) 的序列,该序列.
具有任意长度 ( *
),包括零,并用双引号括起来。
答案3
作为 muru 解决方案的替代方案awk
。
使用cut
:
cut -f 1 -d { < file.txt
使用grep
:
grep -o '".*"' file.txt
或者
grep -o \".*\" file.txt
使用sed
:
sed -r 's/(".*").*/\1/' file.txt
或者
sed -r 's/\{.*\}//' file.txt
甚至:
sed 's/{.*//'
答案4
具有分组的 Perl(.*)
也可以做到这一点:
$ perl -pe 's/"(.*)".*/"\1"/g' input.txt
"xxxxx1"
"xx2"
"xx3 gsdd"
"sdsdf xxx"
"sdfsdf ccc dd"
"dsdsf sfsdf"
"sdfsdfsd"
"sdfsdff"
"sdfsdfdff sdfs"
"sdfsdsds sdfsdf d"
"sdfsdfs sdf sdfsdf"
"sdfsdfsdf sdf"
这里的技巧是,我们匹配整行,并将"(.*)"
双引号之间的所有内容视为一个组。我们通过部分引用匹配的组来替换整行\1
。