Unix 使用awk将包含字母表的列用单引号括起来

Unix 使用awk将包含字母表的列用单引号括起来,unix,awk,Unix,Awk,awk能处理这个吗 输入 输出 'Neil',23,'01-Jan-1990' 25,'Reena',19900203 您可以使用以下脚本: script.awk BEGIN { OFS=FS="," } { for(i= 1; i<=NF; i++) { if( !match( $i, /^[0-9]+$/ ) ) $i = "'" $i "'" } print } BEGIN{OFS=FS=“,”} {对于(i=1;i您可以使用以下脚本: script.awk

awk能处理这个吗

输入

输出

'Neil',23,'01-Jan-1990'
25,'Reena',19900203

您可以使用以下脚本:

script.awk

BEGIN { OFS=FS="," }

{ for(i= 1; i<=NF; i++) { 
    if( !match( $i, /^[0-9]+$/ ) ) $i = "'" $i "'"
  }
  print
}
BEGIN{OFS=FS=“,”}

{对于(i=1;i您可以使用以下脚本:

script.awk

BEGIN { OFS=FS="," }

{ for(i= 1; i<=NF; i++) { 
    if( !match( $i, /^[0-9]+$/ ) ) $i = "'" $i "'"
  }
  print
}
BEGIN{OFS=FS=“,”}

{for(i=1;i不正确)是我的第一次尝试

sed -r 's/([^,]*[a-zA-Z]+[^,]*)(,{0,1})/"\1"\2/g' inputfile
@Sundeep给出了一个很好的评论:我需要单引号,它可以更短:
我尝试匹配,包括行尾的
,这导致了匹配的复杂性。您只需在分隔符之间进行匹配,确保某个地方有字母字符

sed 's/[^,]*[a-zA-Z][^,]*/\x27&\x27/g' inputfile

这是我的第一次尝试

sed -r 's/([^,]*[a-zA-Z]+[^,]*)(,{0,1})/"\1"\2/g' inputfile
@Sundeep给出了一个很好的评论:我需要单引号,它可以更短:
我尝试匹配,包括行尾的
,这导致了匹配的复杂性。您只需在分隔符之间进行匹配,确保某个地方有字母字符

sed 's/[^,]*[a-zA-Z][^,]*/\x27&\x27/g' inputfile
awk进近:

awk -F, '{for(i=1;i<=NF;i++) if($i~/[[:alpha:]]/) $i="\047"$i"\047"}1' OFS="," file

  • if($i~/[:alpha:][]/)
    -if字段包含字母字符

  • \047
    -单引号的八进制代码
    '
    字符

    • awk方法:

      awk -F, '{for(i=1;i<=NF;i++) if($i~/[[:alpha:]]/) $i="\047"$i"\047"}1' OFS="," file
      

      • if($i~/[:alpha:][]/)
        -if字段包含字母字符

      • \047
        -单引号的八进制代码
        '
        字符


      OP需要单引号,而不是双引号……这可以简化为
      sed的/[^,]*[a-zA-Z][^,]*/\x27&\x27/g'
      对于所有sed中的单引号是否都有效?至少由于它依赖于未定义的行为,所以它不在awk中,请参见,但是
      \047
      在sed中似乎根本不起作用,因为
      \0
      被解释为与
      &
      相同,因此我一直依赖
      '\''
      在sed中对该r进行单引号eason@EdMorton至少对于
      gnu-sed
      来说,它是健壮的…语法是
      \xxx产生或匹配一个十六进制ASCII值为xx的字符,对于八进制,需要使用
      \o047
      OP需要单引号,而不是双引号…这可以简化为
      sed的/[^,]*[a-zA-Z][^,]*/\x27&\x27/g'
      对于所有sed中的单引号是否都有效?至少由于它依赖于未定义的行为,所以它不在awk中,请参见,但是
      \047
      在sed中似乎根本不起作用,因为
      \0
      被解释为与
      &
      相同,因此我一直依赖
      '\''
      在sed中对该r进行单引号eason@EdMorton至少对于
      gnu-sed
      来说,它是健壮的…语法是
      \xxx产生或匹配一个十六进制ASCII值为xx的字符,对于八进制,需要使用
      \o047