簡體   English   中英

使用awk打印不帶撇號或空格的新列

[英]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;
  }
'
  • 將要修改的內容分配給變量后,就可以修改該變量。
  • 要刪除的字符應獲取子字符串之前刪除,因為否則會縮短3個字符的子字符串。

這是一個猜測,因為您沒有提供預期的輸出,但這是您要執行的操作嗎?

$ 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM