awk / cutを使用して空白の列データを取得する方法

awk / cutを使用して空白の列データを取得する方法

次の形式のデータがあります。

 16 SQL*Plus                            vilconv1                  dox-conv2
 16 TOAD background query session       Disha                     WORKGROUP\AD

今度は列ごとにデータをインポートしたいと思います。次のコマンドを使用しています。

awk '{print $1,$2}' 

ただし、列 2 には空白があるため、次の出力が提供されます。

16 SQL*Plus      
  16 TOAD

そして私が望むもの:

16 SQL*Plus  
   16 TOAD background query session   

答え1

列がタブ文字で区切られている場合は、タブ文字をフィールド区切り文字として指定できます。これにより、空白を別々の列として扱うawkのデフォルトの動作を防ぎます。

cat <data file> | awk -F"\t" '{print $1, $2}'

root@ubuntu32:/tmp# cat testtext | awk -F"\t" '{print $1, $2}'
16 SQL*Plus
16 TOAD background query session

答え2

@Costasの提案のように、別のオプションは次のとおりです。

gawk '
  {
    f1=substr($0,2,2)
    f2=substr($0,4,36)
    gsub(/ *$/, "", f2)
    print f1 " " f2
  }
'

答え3

これを行う1つの方法にはを含めることができますunexpandexpandこれについての説明とユーティリティを見つけることができます。ここ:

  • このunexpandユーティリティはファイルまたは標準入力を標準出力にコピーし、各行の先頭にある文字を最大文字数に変換し、元の翻訳文字で埋められた同じ列位置を<blank>埋めるために必要な最小文字数に<tab>変換する必要があります。デフォルトでは、タブストップは8列ごとに設定する必要があります。それぞれを出力にコピーし、タブで計算された列位置の数を減らす必要があります。この数を1より小さい値に減らしてはいけません。<space><blank><backspace>

ただし、このスイッチが必要な場合があります-a

  • -a<blank>- 各行の先頭にある文字を翻訳することに加えて、<blank>タブストップの直前にある2つ以上の文字シーケンスをすべてタブで元々塗りつぶされた同じ列位置を埋めるのに必要な最大文字数に変換し、塗りつぶし文字を<tab>翻訳<space>する必要な最小文字数。<blank>

これは、多くのスペースをタブに順次変換する簡単なユーティリティです。だからあなたはできます...

unexpand -a <<\IN | cut -f1
 16 SQL*Plus                            vilconv1                  dox-conv2
 16 TOAD background query session       Disha                     WORKGROUP\AD
IN

...印刷...

 16 SQL*Plus
 16 TOAD background query session

そこで使用したが、必要に応じて使用したり、cut他のものを使用したりできます。awk私がお勧めする理由は、ほぼ確実にインストールされており、使用が非常に簡単で非常に速いからです。区切り記号を交換してスペースの問題を解決し、非常に簡単です。

また、どのように動作するかを示すためにここにあるドキュメントを使用していますが、そうしたい場合があります。

unexpand -a <infile | filter program

関連情報