次の形式のデータがあります。
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つの方法にはを含めることができますunexpand
。expand
これについての説明とユーティリティを見つけることができます。ここ:
- この
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