Perl 使用awk为每个字段插入引号
我正在寻找以下输入基于下面提供的样本 示例:Perl 使用awk为每个字段插入引号,perl,awk,sed,Perl,Awk,Sed,我正在寻找以下输入基于下面提供的样本 示例: eno~ename~address~zip 123~abc~~560000~"a~b~c" 245~"abc ~ def"~hyd~560102 333~"ghi~jkl"~pub~560103 "eno"~"ename"~"address"~"zip" "123"~"abc"~""~"560000"~"a~b~c" "245"~"abc ~ def"~"hyd"~"560102" "333"~"ghi~jkl"~"pub"~"560103" 预
eno~ename~address~zip
123~abc~~560000~"a~b~c"
245~"abc ~ def"~hyd~560102
333~"ghi~jkl"~pub~560103
"eno"~"ename"~"address"~"zip"
"123"~"abc"~""~"560000"~"a~b~c"
"245"~"abc ~ def"~"hyd"~"560102"
"333"~"ghi~jkl"~"pub"~"560103"
预期输出:
eno~ename~address~zip
123~abc~~560000~"a~b~c"
245~"abc ~ def"~hyd~560102
333~"ghi~jkl"~pub~560103
"eno"~"ename"~"address"~"zip"
"123"~"abc"~""~"560000"~"a~b~c"
"245"~"abc ~ def"~"hyd"~"560102"
"333"~"ghi~jkl"~"pub"~"560103"
我在awk中尝试的命令如果分隔符值包含在数据中,则该命令无效。如果对perl/sed/awk有其他建议,请建议
下面是命令:awk'{for(i=1;i请尝试以下内容(仅使用提供的样本进行测试) 解释:现在为上述代码添加解释
awk ' ##Starting awk program here.
BEGIN{ ##Starting BEGIN section of awk program here.
s1="\"" ##Setting variable s1 to " here.
FS=OFS="~" ##Setting value of FS and OFS as ~ here.
} ##Closing BEGIN block of awk code here.
{
for(i=1;i<=NF;i++){ ##Starting for loop here from i=1 to till value of NF here.
if($i!~/^\"|\"$/){ ##Checking condition of value of current field is NOT having s1 value in it.
$i=s1 $i s1 ##Adding s1 variable before and after the value of $i.
} ##Closing block for if condition.
} ##Closing block for for loop here.
} ##Closing main block here.
1 ##Mentioning 1 will print the lines of Input_file.
' Input_file ##mentioning Input_file name here.
awk'##在这里启动awk程序。
在这里开始awk程序的开始部分。
s1=“\”“\”将变量s1设置为“此处”。
FS=OFS=“~”##将FS和OFS的值设置为~此处。
}##在此处关闭awk代码的开始块。
{
对于(i=1;i请尝试以下内容(仅使用提供的样本进行测试)
解释:现在为上述代码添加解释
awk ' ##Starting awk program here.
BEGIN{ ##Starting BEGIN section of awk program here.
s1="\"" ##Setting variable s1 to " here.
FS=OFS="~" ##Setting value of FS and OFS as ~ here.
} ##Closing BEGIN block of awk code here.
{
for(i=1;i<=NF;i++){ ##Starting for loop here from i=1 to till value of NF here.
if($i!~/^\"|\"$/){ ##Checking condition of value of current field is NOT having s1 value in it.
$i=s1 $i s1 ##Adding s1 variable before and after the value of $i.
} ##Closing block for if condition.
} ##Closing block for for loop here.
} ##Closing main block here.
1 ##Mentioning 1 will print the lines of Input_file.
' Input_file ##mentioning Input_file name here.
awk'##在这里启动awk程序。
在这里开始awk程序的开始部分。
s1=“\”“\”将变量s1设置为“此处”。
FS=OFS=“~”##将FS和OFS的值设置为~此处。
}##在此处关闭awk代码的开始块。
{
对于(i=1;i这里您可以将FPAT
与gnu-awk
awk -v FPAT='([^~]*)|("[^"]+")' -v OFS="~" '{for (i=1;i<=NF;i++) if ($i!~/^\"/) $i="\""$i"\""} 1' file
"eno"~"ename"~"address"~"zip"
"123"~"abc"~""~"560000"
"245"~"abc ~ def"~"hyd"~"560102"
"333"~"ghi~jkl"~"pub"~"560103"
awk-vfpat='([^~]*)|(“[^”]+”)-vofs=“~”{for(i=1;i这里您可以将FPAT
与gnu awk
awk -v FPAT='([^~]*)|("[^"]+")' -v OFS="~" '{for (i=1;i<=NF;i++) if ($i!~/^\"/) $i="\""$i"\""} 1' file
"eno"~"ename"~"address"~"zip"
"123"~"abc"~""~"560000"
"245"~"abc ~ def"~"hyd"~"560102"
"333"~"ghi~jkl"~"pub"~"560103"
<代码> AWK-V FPAT=([[^ ] +)] -[OFS= =“~”{ for(i=1;如果有一个字段如<代码>)A~b~c“< /代码> .OguZISmail”,OK没有考虑它,因为它不在OP的样本中,让我现在修复它。我不会修复它,这显然是一个副本。请参阅我对这个问题的评论。由于逻辑是聪明的,虽然代码123>ABC~~ 560000“A~B~C”,但它被上调了。
这不应该是一个有效的输入,因为您只在字段周围使用双引号,而不在字段内使用,并且由于~
用作FS,560000“a~b~c”
这部分将打破所有。正确的应该是560000~“a~b~c”
它认为最好测试字段是否以双引号if($i!~^\“/)开头< /代码>,不包含双引号。<代码>($i!~s1)< /代码>如果有一个字段,如“代码>”A~b~c“< /代码> .OguZISmail,OK不考虑它,因为它不在OP的样本中,现在让我修复它。我不会修复它,这显然是一个副本。请参阅我对这个问题的评论。由于逻辑是聪明的,尽管代码123>ABC~~ 560000”A~b~c。“
这不应该是一个有效的输入,因为您只在字段周围使用双引号,而不在字段内使用,并且由于~
用作FS,560000”a~b~c“
这部分将打破所有。正确的应该是560000~“a~b~c”
它认为最好测试字段是否以双引号if($i!~/^\/)开头。”
,不包含双引号。如果($i!~s1)
的可能重复。唯一的区别是字段分隔符这不是一个真正的重复,而是密切相关。如果您有不同的输入,请提出一个新问题。请确保在发布前也搜索。的可能重复。唯一的区别是字段分隔符这不是一个真正的重复,而是密切相关。如果您有不同的输入,提出一个新问题。请确保在发布前也搜索谷歌。最后两行的搜索结果与预期不符。@user1485267您的示例没有显示这一点。我很少看到这种情况发生,但如果您有,您需要一篇新文章,其中包含一个新问题,以获得新的解决方案。@user1485267,我完全同意Jotne的观点,请始终使用posI don’我不会更正与您实际数据接近的样本,当您不断更改样本时,我们也很难帮助您。很抱歉更改输入。我同意您的观点。我将添加新的帖子。感谢您的解决方案Jotne&Ravindrey您不需要创建新帖子,向您展示如何解决您的问题,无论您的输入是否为c包含或不包含换行符。只需按照此处显示的操作将输入分隔为字段,然后gsub(/^“|“$/,”,$i);$i=“\”“$i”\”"
在循环中,在打印记录之前将每个字段用双引号括起来。在最后两行中,它没有按预期工作。@user1485267您的示例没有显示这一点。我很少看到这种情况发生,但如果有,您需要一篇带有新问题的新文章,以获得新的解决方案。@user1485267,我完全同意Jotne的观点,请始终ost更正接近您实际数据的样本,当您不断更改样本时,我们也很难为您提供帮助。很抱歉更改输入。我同意您的观点。我将添加新的帖子。感谢您的解决方案Jotne&Ravindrey您无需创建新帖子,向您展示如何解决您的问题,无论您的输入是否正确包含或不包含换行符。只需按照此处显示的操作将输入分隔为字段,然后在打印记录之前,将gsub(/^“|“$/,”,$i);$i=“\”“$i”\”
放入循环中,将每个字段用双引号括起来。