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

时间:2017-05-27 12:43:46

标签: unix awk

可以用awk处理吗?

输入

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

输出

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

3 个答案:

答案 0 :(得分:1)

我的第一次尝试不正确

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

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

答案 1 :(得分:1)

awk 方法:

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

输出:

'Neil',23,'01-Jan-1990'
25,'Reena',19900203
  • if($i~/[[:alpha:]]/) - 如果字段包含字母字符

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

答案 2 :(得分:0)

您可以使用此脚本:

<强> script.awk

BEGIN { OFS=FS="," }

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

并按照以下方式运行:awk -f script.awk yourfile

<强>解释

  • 第一行将输入和输出Fieldseparators设置为,
  • 循环测试每个字段,是否只包含数字(/^[0-9]+$/):
    如果不是该字段被放在引号