[英]Using awk to print a new column without apostrophes or spaces
我正在處理一個文本文件,並添加由其他列的某些組件組成的列。 請求刪除空格和撇號的新要求是,我不確定完成此任務的最有效方法。
可以通過以下腳本創建文件的內容:
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命令處理該輸出,但是我希望可以一次通過。
第二種方法很接近,但是對於操作順序:
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;
}
'
這是一個猜測,因為您沒有提供預期的輸出,但這是您要執行的操作嗎?
$ 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
(如果/當您將腳本移至文件時,它將繼續起作用,這與您是否依賴於"'\\''"
僅可從命令行使用),而awk中的字符串,數組和字段從1開始,而不是0,因此您的substr(..,0,3)
是錯誤的,並且awk將無效的起始位置0
視為您使用的第一個有效開始位置是1
。
您收到的"sub third parameter is not a changeable object"
錯誤是因為sub()
修改了您使用第3個參數調用它的對象,但您使用文字字符串來調用它( tolower(substr(...))
)並且您不能修改文字字符串-試試sub(/o/,"","foo")
,如果使用var="foo"; sub(/o/,"",var)
則會得到相同的錯誤var="foo"; sub(/o/,"",var)
var="foo"; sub(/o/,"",var)
有效,因為您可以修改變量的內容。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.