grep/sort/find를 사용하여 고유한 값 추출

grep/sort/find를 사용하여 고유한 값 추출

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를 찾습니다.

관련 정보