5

私はしばらくの間これを解決しようとしていますが、これまでのところ成功していません。コマンド出力があり、それをさらに処理するために噛む必要があります。

私が持っているテキストは次のとおりです。

1/2 [3] (27/03/2012 19:32:54) word word word word 4/5

私が必要としているのは、1/2 [3] 4/5の数字だけを抽出して、次のようになるようにすることです。

1 2 3 4 5

したがって、基本的には、「/」、「[」、「]」など、数字以外のすべての文字を除外しようとしました。FSでawkを試し、正規表現を使用してみましたが、いずれも成功しませんでした。

次に、first:1 second:2 third:3....などのように何かを追加します。同じ構造の行がたくさん含まれているファイルについて話していることを覚えておいてください。すべての列を合計するawk

awk '{sum1+=$1 ; sum2+=$2 ;......etc} END {print "first:"sum1 " second:"sum2.....etc}'

ただし、最初に関連する数値のみを抽出する必要があります。「()」の間にある日付は完全に省略できますが、それらも数値であるため、数字だけでフィルタリングするだけでは、それらと一致するため、十分ではありません。

あなたが私を助けてくれることを願っています事前に感謝します!

4

7 に答える 7

5

これ:sed -r 's/[(][^)]*[)]/ /g; s/[^0-9]+/ /g'動作するはずです。2つのパスを作成し、最初に括弧で囲まれた式を削除してから、数字以外のすべての実行を単一のスペースに置き換えます。

于 2012-04-04T08:55:44.127 に答える
2

あなたはのようなことをすることができますsed -e 's/(.*)//' -e 's/[^0-9]/ /g'。数字以外のすべての文字をスペースに置き換えるのではなく、丸括弧内のすべてを削除します。余分なスペースを取り除くために、あなたはそれをに与えることができますcolumn -t

$ echo '1/2 [3] (27/03/2012 19:32:54) word word word word 4/5' | sed -e 's/(.*)//' -e 's/[^0-9]/ /g' | column -t
1  2  3  4  5
于 2012-04-04T08:52:29.443 に答える
1

TXR:

@(collect)
@one/@two [@three] (@date @time) @(skip :greedy) @four/@five
@(filter :tonumber one two three four five)
@(end)
@(bind (first second third fourth fifth)
       @(mapcar (op apply +) (list one two three four five)))
@(output)
first:@first second:@second third:@third fourth:@fourth fifth:@fifth
@(end)

データ:

1/2 [3] (27/03/2012 19:32:54) word word word word 4/5
10/20 [30] (27/03/2012 19:32:54) word word 40/50

走る:

$ txr data.txr data.txt
first:11 second:22 third:33 fourth:44 fifth:55

簡単にエラーチェックを追加できます:

@(collect)
@  (cases)
@one/@two [@three] (@date @time) @(skip :greedy) @four/@five
@  (or)
@line
@  (throw error `badly formatted line: @line`)
@  (end)
@  (filter :tonumber one two three four five)
@(end)
@(bind (first second third fourth fifth)
       @(mapcar (op apply +) (list one two three four five)))
@(output)
first:@first second:@second third:@third fourth:@fourth fifth:@fifth
@(end)

$ txr data.txr -
foo bar junk
txr: unhandled exception of type error:
txr: ("badly formatted line: foo bar junk")
Aborted

TXR は堅牢なプログラミング用です。強力な型付けがあるため、文字列に数字が含まれているという理由だけで文字列を数値として扱うことはできません。変数は使用前にバインドする必要があるため、スペルミスのある変数は暗黙のうちにゼロまたは空白にデフォルト設定されるのではなく、unbound variable <name> in <file>:<line>型エラーを生成します。テキスト抽出は、ある形式の入力を別の形式であると誤解しないように、多くの特定のコンテキストで実行されます。

于 2012-04-04T19:52:48.420 に答える
0

それがあなたが望むものであるならば、以下を見てください:

kent$  echo "1/2 [3] (27/03/2012 19:32:54) word word word word 4/5"|sed -r 's/\([^)]*\)//g; s/[^0-9]/ /g'
1 2  3                       4 5

見栄えを良くしたい場合:

kent$  echo "1/2 [3] (27/03/2012 19:32:54) word word word word 4/5"|sed -r 's/\([^)]*\)//g; s/[^0-9]/ /g;s/ */ /g'
 1 2 3 4 5
于 2012-04-04T08:52:41.053 に答える
0

これにより、括弧内のテキストを除いて抽出された数字が表示されます。

digits=$(echo '1/2 [3] (27/03/2012 19:32:54) word word word word 4/5' |\
       sed 's/(.*)//' | grep -o '[0-9][0-9]*')
echo $digits

または純粋なsedソリューション:

echo '1/2 [3] (27/03/2012 19:32:54) word word word word 4/5' |\
sed -e 's/(.*)//' -e 's/[^0-9]/ /g' -e 's/[ \t][ \t]*/ /g'

出力:

1 2 3 4 5
于 2012-04-04T08:53:26.230 に答える
0
 awk '{ first+=gensub("^([0-9]+)/.*","\\1","g",$0)
        second+=gensub("^[0-9]+/([0-9]+) .*","\\1","g",$0)
        thirdl+=gensub("^[0-9]+/[0-9]+ \[([0-9]+)\].*","\\1","g",$0)
        fourth+=gensub("^.* ([0-9]+)/[0-9]+ *$","\\1","g",$0)
        fifth+=gensub("^.* [0-9]+/([0-9]+) *$","\\1","g",$0)
      }
      END { print "first: " first " second: " second " third: " third " fourth: " fourth " fifth: " fifth
      }

あなたのために働くかもしれません。

于 2012-04-04T08:57:05.110 に答える
0

特殊なフィールドセパレーターを設定する場合は、awk を 1 回渡すだけで十分です。スラッシュ、スペース、開き括弧、閉じ括弧のいずれかでフィールドを区切ります。

awk -F '[][/ ]' '
  {s1+=$1; s2+=$2; s3+=$4; s4+=$(NF-1); s5+=$NF}
  END {printf("first:%d second:%d third:%d fourth:%d fifth:%d\n", s1, s2, s3, s4, s5)}
'
于 2012-04-04T11:12:04.563 に答える