![grep/sort/find를 사용하여 고유한 값 추출](https://linux55.com/image/6508/grep%2Fsort%2Ffind%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EA%B3%A0%EC%9C%A0%ED%95%9C%20%EA%B0%92%20%EC%B6%94%EC%B6%9C.png)
YYYYMMDD.Txt
형식에 따라 이름이 지정된 텍스트 파일이 많이 있습니다 (오늘은 20160420.Txt
).
각 파일은 기본적으로 타임스탬프와 고유 ID를 포함하는 로그이며 각 값은 탭 구분 기호로 구분됩니다.
예를 들어 20160420.Txt
다음 값을 사용합니다.
DATE TIME ID
20160420 0135 123456
20160420 0240 234567
20160420 1252 345678
이 파일에 있는 모든 고유 ID를 추출해야 하지만 지난 6개월 동안만 추출해야 합니다.
문제는 모든 파일이 지난 주에 다시 생성되었기 때문에 mtime을 사용할 수 없다는 것입니다(예: mtime은 파일 이름과 일치하지 않습니다).
grep
// 를 사용하여 find
이를 수행할 수 있는 방법이 있습니까 sort
?
답변1
6개월 전의 정확한 날짜를 찾는 것은 쉬운 일이 아니며, 특히 현재 날짜가 특정 달의 31일인 경우 더욱 그렇습니다. 하지만 find
이를 사용하고 수행하는 방법을 알고 계시다면 -mtime
파일 이름의 날짜를 기준으로 파일을 터치했을 뿐입니다.
for x in *.Txt; do
dd=${x%.Txt}
touch -t "$dd"0000 "$x"
done
그런 다음 사용mtime
답변2
사용앗이 일을 하고,SQLite날짜를 위해.
sqlite3 <<< "select date('2016-04-20', '-6 month');"
2015-10-20
댄디, 그렇지 않나요? awk에는 SQLite에 필요한 하이픈을 삽입/제거하는 문자열 기능이 있으며 탭 구분 기호로 분할됩니다.
awk 'NR == 1 {next}; { IDS[$3]++ }; END {for (K in IDS) {print K}}' ids
123456
345678
234567
또한 빠른 속도도 보장됩니다.
답변3
다른 답변에 대한 @cas의 의견에 대한 후속 조치:
six_months=$(date -d "6 months ago" "+%Y%m%d")
for f in *.Txt; do
file_date=${f%.Txt}
[[ $file_date > $six_months ]] && echo "$f"
done |
xargs awk 'FNR > 1 {print $3}' |
sort -u > unique_ids_in_last_6_months
for 루프는 "한정된" 파일 이름을 인쇄합니다. xargs는 파일 이름을 한 번에 하나씩 일괄적으로 awk에 전달합니다(awk에 대한 호출 수를 최소화함). awk는 헤더를 버리고 마지막 열을 인쇄합니다. sort는 귀하의 고유 ID를 찾습니다.