如何使用“awk”按列拆分文本?

如何使用“awk”按列拆分文本?

我如何提取第一列(“”中的第一列)

"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

相关内容