洗練されていないアプローチについては、以下の 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
( )の部分文字列を出力します。substr
os
length
~/$ 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。