使用awk打印没有撇号或空格的新列

时间:2017-08-29 14:43:35

标签: bash awk

我正在处理文本文件并添加由其他列的某些组件组成的列。要求删除空格和撇号的新要求,我不确定完成此任务的最有效方法。

可以通过以下脚本创建文件的内容:

content=(
  john    smith          thomas       blank    123    123456    10  
  jane    smith          elizabeth    blank    456    456123    12  
  erin    "o'brien"      margaret     blank    789    789123    9  
  juan    "de la cruz"   carlos       blank    1011   378943    4
)
# put this into a tab-separated file, with the syntactic (double) quotes above removed
printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\n' "${content[@]}" >infile

这就是我现在所拥有的,但它无法删除空格和撇号:

awk -F "\t" '{OFS="\t"; print $1,$2,$3,$5,$6,$7,$6 tolower(substr($2,0,3)); }' infile > outfile

这会抛出一个错误“第三个参数不是一个可更改的对象”,这是有道理的,因为我正在尝试处理输出而不是输入,我想。

awk -F "\t" '{OFS="\t"; print $1,$2,$3,$5,$6,$7,$6 sub("'\''", "",tolower(substr($2,0,3))); }' infile > outfile

有没有办法可以用小写打印第6列和第2列部分的组合,同时从输出到新列中删除空格和撇号?在最糟糕的情况下,我可以使用我的第一个命令创建一个新文件,并使用新的awk命令处理该输出,但我想在一次通过中执行此操作。

2 个答案:

答案 0 :(得分:0)

第二种方法很接近,但是为了操作顺序:

awk -F "\t" '
  BEGIN { OFS="\t"; }
  {
    var=$2;
    sub("['\''[:space:]]", "", var);
    var=substr(var, 0, 3);
    print $1,$2,$3,$5,$6,$7,$6 var;
  }
'
  • 将要修改的内容分配给变量,可以就地修改该变量。
  • 在获取子字符串之前,应删除要删除的字符,否则会缩短3个字符的子字符串。

答案 1 :(得分:0)

这是一个猜测,因为你没有提供预期的输出,但这是你正在尝试做的吗?

$ cat tst.awk
BEGIN { FS=OFS="\t" }
{
    abbr = $2
    gsub(/[\047[:space:]]/,"",abbr)
    abbr = tolower(substr(abbr,1,3))
    print $1,$2,$3,$5,$6,$7,$6 abbr
}

$ awk -f tst.awk infile
john    smith   thomas  123     123456  10      123456smi
jane    smith   elizabeth       456     456123  12      456123smi
erin    o'brien margaret        789     789123  9       789123obr
juan    de la cruz      carlos  1011    378943  4       378943del

请注意,在' - 封闭的awk脚本中表示'的方式是使用八进制\047(如果/当您将脚本移动到a时,它将继续有效)文件,不像你依赖"'\''"只能从命令行工作),并且awk中的字符串,数组和字段从1开始,而不是0,所以你的substr(..,0,3)是错的,awk是处理0的无效起始位置,就像您使用了1的第一个有效起始位置一样。

您获得的"sub third parameter is not a changeable object"错误是因为sub()将您调用它的对象修改为第三个参数,但是您使用文字字符串调用它({{1}的输出您无法修改文字字符串 - 尝试tolower(substr(...))如果您使用sub(/o/,"","foo")这是有效的,您将获得相同的错误,因为您可以修改内容变量