Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl 使用awk为每个字段插入引号_Perl_Awk_Sed - Fatal编程技术网

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”\”
放入循环中,将每个字段用双引号括起来。