1

awk を使用して、次のテキストを適切な列に分割する方法を探しています。

私は持っている

[2013-06-17 13:30] [PACMAN] Running 'pacman -S cups'
[2013-06-17 13:30] [PACMAN] reinstalled cups (1.6.2-2)

したがって、以下に関して:

[2013-06-17 13:30] [PACMAN] Running 'pacman -S cups'

をお願いします:

$1 to be [2013-06-17 13:30]
$2 to be [PACMAN] 
$3 to be Running
$4 to be 'pacman -S cups'

為に:

[2013-06-17 13:30] [PACMAN] reinstalled cups (1.6.2-2)

をお願いします:

$1 to be [2013-06-17 13:30]
$2 to be [PACMAN]
$3 to be reinstalled
$4 to be cups (1.6.2-2)

私はたくさんのグーグルをしましたが、何も見つかりませんでした。

4

3 に答える 3

3

(以下は GNU に固有のようawkです。BSDawkは、サブグループを配列にキャプチャすることをサポートしていません。)

awkこれは、のフィールド分割に頼るのではなく、文字列全体を特定の正規表現と照合したい場合です。

$ echo "[2013-06-17 13:30] [PACMAN] Running 'pacman -S cups'" | awk '
    {
       match($0, "^(\\\[.*\\\]) (\\\[.*\\\]) ([a-zA-Z]*) (.*)$", a);
       $1=a[1];
       $2=a[2];
       $3=a[3];
       $4=a[4];
       print $2
    }'
[PACMAN]

を呼び出した後、正規表現に一致するからのテキストがmatch配列に入力されます。0 番目の要素は一致する文字列全体であり、残りの要素は正規表現内の対応する括弧で囲まれたグループに設定されます。a$0

正規表現を記述するより良い方法があるかもしれません。\[プレーンとして扱われるという警告が表示されます[が、全体的には機能しているようです。

于 2013-06-17T19:02:01.130 に答える
1

洗練されていないアプローチについては、以下の 4 番目のワンライナーを参照してください。できます!!しかし、あなたは私の答えを受け入れたくないかもしれません。コマンドはうるさいので、これを保守可能にするために、コメントを「ドキュメント」として追加する必要があるでしょう。そのため、.awk以下のファイルにも含めました:-)

それでも、ファイルの形式がかなり単純であっても、それ自体が文書化されているという理由だけで、@chepner notes.として正規表現を使用するのが最善の方法だと思います。

~/$ cat test.txt 
[2013-06-17 13:30] [PACMAN] Running 'pacman -S cups'
[2013-06-17 13:30] [PACMAN] reinstalled cups (1.6.2-2)

1)列 1:

 ~/$ awk -F '[\]]' '{print $1"]"}' test.txt 
 [2013-06-17 13:30]
 [2013-06-17 13:30]

2)列 1 と 2:

~/$ awk -F '[\]]' '{print $1"]" $2"]" }' test.txt 
[2013-06-17 13:30] [PACMAN]
[2013-06-17 13:30] [PACMAN]

3) 3 つすべて:

~/$ awk -F '[\]]' '{print $1"]" $2"]"  $3}' test.txt
[2013-06-17 13:30] [PACMAN] Running 'pacman -S cups'
[2013-06-17 13:30] [PACMAN] reinstalled cups (1.6.2-2)

4)上記と同じですが、3 番目のフィールドaを印刷Runningまたはreinstalled個別に配列に分割します。最初の要素から取得したオフセット ( ) から始まる配列a( )の部分文字列を出力します。substroslength

~/$ awk -F ']' '{split($3,a," "); os=(length(a[1])+2) ; print $1"]" $2"] " a[1]" " substr($3,os) }' test.txt
[2013-06-17 13:30] [PACMAN] Running 'pacman -S cups'
[2013-06-17 13:30] [PACMAN] reinstalled cups (1.6.2-2)

これは BSDawkであるため、OSX で動作するはずです。

# split.awk ... run with: awk -f split.awk  data.txt

BEGIN{
FS="]"   # Make the field separator be "]"
}
{
  # Split the third field into array "a"
  split($3,a," ") 
  os=(length(a[1])+2) 
   # Print the first two fields and a substring of array "a" (substr)            
   # starting at offset ("os") taken from the length of the first element 
   # right adjusted for two whitespaces.
  print $1"]" $2"] " a[1]" " substr($3,os) 
}

HTH。

于 2013-06-17T18:38:55.090 に答える