我正在处理文本文件并添加由其他列的某些组件组成的列。要求删除空格和撇号的新要求,我不确定完成此任务的最有效方法。
可以通过以下脚本创建文件的内容:
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命令处理该输出,但我想在一次通过中执行此操作。
答案 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;
}
'
答案 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")
这是有效的,您将获得相同的错误,因为您可以修改内容变量