파일에 사용자 그룹의 로그인 데이터가 포함되어 있다고 가정합니다.
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
여러 공간 처리
위의 예에는 모두 단일 공백이 있습니다. 날짜가 있는 파일의 경우 항목 사이에 공백이 하나 이상 있을 수 있는 경우그리고시간과 목적:
awk -F' *[ (]' '{a[$1]=a[$1] $3 " " $4 "\n"} END{for (name in a)print name "\n" a[name]}' loginFile
답변2
이것은 파이썬을 통해 달성됩니다.
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