2010-08-14 5 views
0

나는쉘 스크립트를 사용하여 다음 파일을 정렬하는 방법은 무엇입니까?

11:00AM JOHN STAMOS 1983-08-07 I like Pizza Hut 
12:00AM JACK SPARROW PIRATE 1886-09-07 I like Pizza Hut and DOminoz 
11:00AM SANTA 1986-04-01 I like cold beer 

가 어떻게 날짜 열에서 위의 파일을 정렬 할 아래 같은 텍스트 파일이? 내가 직면 한 문제는 가변 길이 이름 열 때문입니다. 어떤 사람들은 처음에는 중간 이름을 가지는데, 그 중 일부는 오직 이름 뿐이라는 것입니다.

답변

1
sed 's/\([0-9]\{4\}\(-[0-9]\{2\}\)\{2\}\)/|\1/' | sort -t '|' -k 2| sed s/'|'// 
+0

+1 : 적절한 위치에 대체 구분 기호를 추가하는 것이 좋습니다. 내 대답보다 유연 할 것 같아. –

0
cat file.txt | python -c 'import re, sys; print "".join(sorted(sys.stdin, key=lambda x:re.findall("\d{4}-\d{2}-\d{2}",x)))' 
1

날짜를 맨 앞에 복사 한 다음 기본적으로 전체 줄을 정렬 키로 사용하는 정렬 작업 만 수행하면됩니다. 그런 다음 날짜를 다시 제거하십시오.

필자는 sed를 사용하여 해당 nnnn-nn-nn 형식으로 위치한 (마지막) 날짜까지 모든 것을 선택하고 날짜를 앞쪽으로 복사합니다.

정렬 후에는 정면에서 날짜를 다시 삭제할 때 sed (또는 컷 -c11- 쉬울 것)를 사용하십시오.

sed 's/^\(.* \([0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] \)\)/\2\1/' | 
sort | 
sed 's/^[0-9][0-9][0-9][0-9]-[0-9][0-9]-[0-9][0-9] //' 

이주기 :

리눅스에서 작동

12:00AM JACK SPARROW PIRATE 1886-09-07 I like Pizza Hut and DOminoz 
11:00AM JOHN STAMOS 1983-08-07 I like Pizza Hut 
11:00AM SANTA 1986-04-01 I like cold beer 

이 데이터를 저장하기위한 작동하지만 데이터 변경 (예를 들어 당신이 라인에서 여러 날짜가있는 경우 쉽게 꽤 어색 얻을 수).

0

순수 배쉬 :

declare -a array 
declare -a order 

IFS=$'\n' 
array=($(cat "$infile")) 

index=0 
for line in "${array[@]}"; do 
    [[ "$line" =~ ([[:digit:]]+)-([[:digit:]]+)-([[:digit:]]+) ]] 
    key="${BASH_REMATCH[1]}${BASH_REMATCH[2]}${BASH_REMATCH[3]}" 
    if [ -z "${order[key]}" ] ; then 
    order[key]="$index" 
    else 
    order[key]="${order[key]} $index" 
    fi 
    ((index++)) 
done < "$infile" 

IFS=' ' 
for key in ${order[*]}; do 
    printf "%s\n" "${array[key]}" 
done 

날짜에서 인덱스를 생성하고 정렬 된 목록으로 그들을 사용합니다.

+0

두 줄 이상에 같은 날짜가 있으면 실패합니다. 그렇지 않으면 영리합니다. –

+0

네, 맞습니다. 방금 솔루션을 개선했습니다. –

관련 문제