
ファイルにユーザーグループのログインデータが含まれているとします。
bobby activityname 2014-05-12([email protected])
bill activityname 2014-06-12([email protected])
bobby activityname 2014-06-12([email protected])
人々の名前とログインした日付を表示するcewファイルを作成するスクリプトをどのように作成できますか?
bill
2014-06-12
bobby
2014-05-12
2014-06-12
答え1
$ awk -F'[ (]' '{a[$1]=a[$1] $3 "\n"} END{for (name in a)print name "\n" a[name]}' loginFile
bobby
2014-05-12
2014-06-12
bill
2014-06-12
どのように動作しますか?
-F'[ (]'
これは、
awk
フィールド区切り文字としてスペースまたは左角かっこを許可するように指示します。a[$1]=a[$1] $3 "\n"
これにより、各ユーザーのログイン日が配列に保存されます
a
。END{for (name in a)print name "\n" a[name]}
ファイルの読み取りが終わったら、収集したデータを印刷します。
出力をファイルとして保存
出力をファイルに保存するには、シェルを使用できますリダイレクト。したがって:
awk -F'[ (]' '{a[$1]=a[$1] $3 "\n"} END{for (name in a)print name "\n" a[name]}' loginFile >newFile
処理日そして一度
入力ファイルが次のようになるとします。
$ cat loginFile2
bobby activityname 2014-05-12 15:20([email protected])
日付と時刻を取得するには、次を実行します。
$ awk -F'[ (]' '{a[$1]=a[$1] $3 " " $4 "\n"} END{for (name in a)print name "\n" a[name]}' loginFile2
bobby
2014-05-12 15:20
複数の空間処理
上記の例には、すべて単一のスペースがあります。日付を含むファイルの場合、項目間にスペースが1つ以上ある場合そして時間と目的:
awk -F' *[ (]' '{a[$1]=a[$1] $3 " " $4 "\n"} END{for (name in a)print name "\n" a[name]}' loginFile
答え2
これはPythonを介して達成されます。
import sys
import re
from collections import defaultdict
file = sys.argv[1]
f = open(file, 'r')
m = re.findall(r'(?m)^(\S+).*?\b(\d{4}-\d{2}-\d{2})(?=\()', f.read())
d = defaultdict(list)
for k, v in m:
d[k].append(v)
result = dict(d.items())
for i in result:
print(i)
print('\n'.join([x for x in result[i]]))
print('\n', end = "")
上記のスクリプトをファイルに保存し、script.py
端末で次のコマンドを実行して入力ファイルに対してスクリプトを実行します。
python3 script.py inputfile