包含缺少双引号的字符串

时间:2016-06-08 12:52:59

标签: shell awk

我有一个如下输入文件。问题是该文件是由管道分隔并用双引号括起来的,可选。它在字符串末尾的第三个字段中被遗漏,我可以看到只要长度超过2,就会发生这种情况。

"SER1828"|"ZXC"|"A1"|10002 
"SER1878"|"IOP"|"B1"|98989
"SER1930"|"QWE"|"A2"|10301 
"SER1930"|"QWE"|"Asdf2|10301 # 3rd field -> closing " missed out

输出应该看起来像

"SER1828"|"ZXC"|"A1"|10002
"SER1878"|"IOP"|"B1"|98989 
"SER1930"|"QWE"|"A2"|10301 
"SER1930"|"QWE"|"Asdf2"|10301

我正在尝试使用一些awk命令,但无法实现它。

awk -F'|' -v q=\" '{$3=$3 q;}1' OFS=| temp  
awk -F'|' -v q=\" '{if (length($3) > 2) ($3=$3;}1)}' OFS='|'  temp

3 个答案:

答案 0 :(得分:2)

使用awk你可以写,

awk -F'"?\\|' -vOFS='"|' '{print $1, $2, $3, $4}'

示例

awk -F'"?\\|' -vOFS='"|' '{print $1, $2, $3, $4}'  input
"SER1828"|"ZXC"|"A1"|10002
"SER1878"|"IOP"|"B1"|98989
"SER1930"|"QWE"|"A2"|10301
"SER1930"|"QWE"|"Asdf2"|10301
  • 它的作用是什么?

  • -F'"?\\|'将输入字段分隔符设置为"||

  • -vOFS='"|'将输出字段分隔符设置为"|。这始终设置,即使输入字段分隔符为|"|

或者你也可以写

awk -F'"?\ |' -vOFS ='" |' ' 1'输入

此处1始终评估为true,在这种情况下,它将打印整行。

awk -F'"?\\|' -vOFS='"|'  '1' input

awk -F'"?\\|' -vOFS='"|'  '{$1=$1}1' input

请参阅@ Kent的评论。

修改

如果您想根据长度添加仅针对第三个字段的引用,您可以编写类似

的内容
awk -F'|' -vOFS='|' '{print $1, $2, $3(length($3)>4 ? "\"" : ""), $4}'

答案 1 :(得分:1)

这个sed one-liner适用于给定的例子:

sed 's/\([^"]\)|"/\1"|"/' file  # this only works for the original example

这适用于原始和当前示例:

sed 's/\([^"]\)|/\1"|/' file

答案 2 :(得分:0)

awk '{sub(/Asdf2/,"Asdf2\"")}1' file
"SER1828"|"ZXC"|"A1"|10002 
"SER1878"|"IOP"|"B1"|98989
"SER1930"|"QWE"|"A2"|10301 
"SER1930"|"QWE"|"Asdf2"|10301