awkで元の$ 0区切り文字をそのまま維持しながら、さまざまなフィールドをどのように印刷しますか?

awkで元の$ 0区切り文字をそのまま維持しながら、さまざまなフィールドをどのように印刷しますか?

awk部分文字列の位置と長さが元の$ 0のフィールド位置に基づいている場合、$ 0の部分文字列を抽出する方法は?

これは、最初の項目を削除することと実質的に同じです。リーダーフィールドと最後追跡するフィールドと元の $0 で始まるすべてのフィールドの先頭と末尾の区切り文字

例: 現在の範囲は US$4 から US$8(含む) だけを知っています。
区切り文字はスペースおよび/または単一のコンマです。" , "それとも","...そして先行する区切り文字は無視されます。

          Input: "   a  a  a   X marks   the   start,   Y   marks the  end  "
Expected Output: "X marks   the   start,     Y"

答え1

awkはフィールドの位置や区切り文字列を覚えていません。フィールドの場所を手動で検索する必要があります。あまり難しくありません。

echo "   a  b  c   X marks   the   start,   Y   marks the  end  " |
awk '{
    i=1; n=1; tmp=$0;  # i=field number, n=column number
    while (match(tmp, / *, *| +/)) {
        A[i]=n; B[i]=n+RSTART-1;     # A[i],B[i] = start,end of delimiter i
        ++i; n+=RSTART+RLENGTH-1;
        tmp=substr(tmp,RSTART+RLENGTH)
    }
    print substr($0, A[5], B[9]-A[5])   # start at 4+1 because the first field is empty
}'

答え2

区切り文字としてタブ文字がない限り、これは解決策になる可能性があります。

#!/usr/bin/awk -f

  {
    start = index($0, " " $4 " ")
    stop  = index($0, " " $8 " ")
    print substr($0, start+1, stop - start + length($8))
  }

答え3

現時点では、前の区切り文字がある場合とない場合には機能しますが、フィールドに「正規表現に敏感な」データが含まれていると失敗します。解決策は、各フィールドを正規表現ポイント.{フィールドフィールド}...に置き換えることです。これはリンクです このようなバージョンでは...這いますが、上記の問題と競合しません。

awk 'BEGIN { FS = "([ \t]+)|([ \t]*,[ \t]*)" }
{ # Ignore leading delimiter, if present 
  hasLeadDlm = match($0, "^("FS")")
  LeadDlm = substr($0, 1, RLENGTH)
  if (hasLeadDlm) { sub("^("FS")", ""); }    # delete leading whitespace 
  sub("^"$1"("FS")"$2"("FS")"$3"("FS")", "") # delete leading fields
  match( $0, "^"$1"("FS")"$2"("FS")"$3"("FS")"$4"("FS")"$5)
  print substr($0, 1, RLENGTH)
}' <<< \
"a    X  a   X marks   the   start, ssY   marks the  end  
 a    X  a   X   marks the   start,  sY   marks the  end  
  a   X  a   X marks     the start,   Y   marks the  end  
   a  X  a   X marks   the     start ,Y   marks the  end  
    a   X  a   X marks   the   start,sssY   marks the  end"

関連情報