0

次の文字列を与えるgrepコマンドがあります。

20121121001100 18 0 16 2 18

しかし、私はこの文字列を変更して取得したいと思います

20121121 001 18 0 16 2 18

上記の値は、以下によって抽出されています。

for i in `ls -1 file.txt | sort`; do echo $i`
grep datetime $i | wc -l ``
grep abc $i | wc -l ``
grep def $i | wc -l ``
grep ghi $i | wc -l ``
grep jkl $i | wc -l ` ; done | cut -c9-500

元の文字列が次の形式であるため、cut-c9-500が使用されます

datetime20121121001100 18 0 16 2 18

カット-c9-500リターン

20121121001100 18 0 16 2 18

誰かが私が得るのを手伝ってくれませんか

20121121 001 18 0 16 2 18

(つまり、日付部分から最後の3桁を削除します)

4

2 に答える 2

1

あなたがしたい/したいことのほとんどはで達成することができますawk。しかし、最低限必要なものは次のとおりです。

for i in `ls -1 file.txt | sort`; do echo $i`
grep datetime $i | wc -l ``
grep abc $i | wc -l ``
grep def $i | wc -l ``
grep ghi $i | wc -l ``
grep jkl $i | wc -l ` ; done | cut -c9-500 | awk '{print substr($0,1,11) substr($0,15) }'

awkテキスト処理に非常に優れています。

編集:あなたが何をしているのかわかりませんが、基本的にこれは(ほぼ)同じです:

awk 'FILENAME != oldfilename {oldfilename = FILENAME; dt = 0 ; a = 0; d = 0; g = 0; j = 0}
     /datetime/ {dt++}
     /abc/ {a++}
     /def/ {d++}
     /ghi/ {g++}
     /j/ {j++}
     END {print FILENAME, dt, a, d, g, j}' *

そして、それはより速く、より少ないプロセスなどです...基本的にawkはファイルを処理し、指定された文字列の出現をカウントし、ファイルが終了すると(最後の行の後)レポートを印刷します。

変更された仕様:

for i in `ls -1 file.txt | sort`; do echo $i`
grep datetime $i | wc -l ``
grep abc $i | wc -l ``
grep def $i | wc -l ``
grep ghi $i | wc -l ``
grep jkl $i | wc -l ` ; done | cut -c9-500 | awk '{print substr($0,1,8) " " substr($0,9,4) substr($0,15) }'
于 2012-11-22T14:36:44.763 に答える
0

sedへのパイプ:

echo "20121121001100 18 0 16 2 18" | sed -r 's/^([0-9]+)[0-9][0-9][0-9] (.*)$/\1 \2/'

与える

20121121001 18 0 16 2 18
于 2012-11-22T14:38:27.480 に答える