我有一个如下输入文件。问题是该文件是由管道分隔并用双引号括起来的,可选。它在字符串末尾的第三个字段中被遗漏,我可以看到只要长度超过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
答案 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