2013-04-17 1 views
0

파일 이름에 첨부 된 '날짜 문자열'에 따라 디렉토리에있는 파일을 정렬하려고합니다. 예를 들어 파일은 다음과 같습니다 SSA_F12_05122013.request.done SSA_F13_12142012.request.done SSA_F14_01062013.request.done 여기에서 0512201312142012 및 01062013은 날짜 형식을 나타냅니다. 파일 이름에 날짜 문자열에 이러한 파일을 정렬하는 유닉스 쉘 스크립트를 제공하는 데 도움을주십시오 (내림차순 및 오름차순).파일 이름에 '날짜 문자열'에 따라 파일을 정렬하는 유닉스 쉘 스크립트

미리 감사드립니다. 종류 AWK와와

+0

직접 해보려고했는데 어느 부분에 붙어 있었습니까? – Johnsyweb

+0

John,이 플랫폼의 초보자이며이를 수행하는 방법을 모릅니다. 내가 sort 명령을 사용했지만 파일 이름 (날짜를 포함)의 일부를 취할 수없는 그것에 따라 파일을 정렬하려했습니다. 이 문제를 해결해주세요. –

+1

이름 지정 패턴을 담당 한 사람을 찾아서 처음부터 패턴을 쉽게 정렬 할 수 없도록하기 위해 뒷면에서 힘차게 걷어차주십시오. 그런 다음 패턴을 변경할 수 없는지 알아보십시오. YYYY-MM-DD는 정렬 할 수있을뿐만 아니라 모호하지 않습니다. (만약'12142012'가 아니라면, 여러분의 예제에서 어떤 숫자가 "month"인지, 어떤 숫자가 "day"인지 모른다.) – DevSolar

답변

0

하나 개의 방법 :

ls -1|awk -F'[_.]' '{s=gensub(/^([0-9]{4})(.*)/,"\\2\\1","g",$3);print s,$0}'|sort|awk '$0=$NF' 

우리가 그것을 무너 뜨리는 경우 :

ls -1| 
awk -F'[_.]' '{s=gensub(/^([0-9]{4})(.*)/,"\\2\\1","g",$3);print s,$0}'| 
sort| 
awk '$0=$NF' 

ls -1 단지 예. 한 줄에 하나씩 파일 목록을 가져올 방법이 있다고 생각합니다.

테스트 조금 :

kent$ echo "SSA_F13_12142012.request.done 
SSA_F12_05122013.request.done 
SSA_F14_01062013.request.done"|awk -F'[_.]' '{s=gensub(/^([0-9]{4})(.*)/,"\\2\\1","g",$3);print s,$0}'| 
sort| 
awk '$0=$NF' 
SSA_F13_12142012.request.done 
SSA_F14_01062013.request.done 
SSA_F12_05122013.request.done 
0
ls -lrt *.done | perl -lane '@a=split /_|\./,$F[scalar(@F)-1];$a[2]=~s/(..)(..)(....)/$3$2$1/g;print $a[2]." ".$_' | sort -rn | awk '{$1=""}1' 
+0

마침내'awk '{print $ NF}' '파일 이름을 얻는 것입니다. – Inductiveload

+0

정말 도움이됩니다. 위 명령을 실행하면 오류가 awk : 구문 오류가 발생했습니다. 1 행 근처에 구문 오류가 있습니다. awk : 1 행 근처에서 실행 중입니다.ls -lrt * .done | perl -lane '@ a = split/_ | \ ./,$ F [scalar (@F) -1]; $ a [2] = ~ s/(..) (..) (....)/$ 3 $ 2 $ 1/g; $ a [2]를 인쇄하십시오. "". $ _ '| sort -rn 결과가 예상대로 정렬 된 방식으로 반환됩니다. awk 명령을 사용하는 것에 대해 확실하지 않고 위의 명령을 이해하지 못했습니다. coz는 매우 최소한의 지식 만 가지고 있습니다. :) 당신의 대답은 정말 도움이되며 위의 명령에 대한 설명은 꽤 감사하겠습니다. Tnx 많이 있습니다. –

0
ls *.done | perl -pe 's/^.*_(..)(..)(....)/$3$2$1$&/' | sort -rn | cut -b9- 

이 +

+0

Sidharth, 그 일을 많이 고마워.하지만 나는 완전한 진술을 분명히 이해할 수 없다. :) 위의 진술에서 각 명령이하는 일을 간단하게 텍스트로 적어 주실 수 있습니까? –

+0

perl 대체 명령을 사용하여 YYYYMMDD 형식으로 날짜를 다시 정렬하고 파일 이름의 시작 부분에 임시로 첨부하여 정렬 기능이 올바르게 작동합니다. 정렬 후 처음 8 문자는 cut -b9를 사용하여 제거됩니다. perl 정규식 구문은 [here] (http://www.cs.tut.fi/~jkorpela/perl/regexp.html)에서 참조 할 수 있습니다. –

+0

이것은 매우 도움이, 문제 해결, 많이 감사합니다 –

2

흠 ... sort 자체가 정의 할 수있는 능력을 가질 때 왜 AWK와 펄 같은 거물급에 전화를 정확히에 할 것 정렬 하시겠습니까? 이 필드 1, 열 (13)에 이르기까지 키 종류를 정의

-k 1.13,1.16 

1을 필드하기 위해, 열 (16) (A 필드가 기본적으로 구분된다

ls SSA_F*.request.done | sort -k 1.13,1.16 -k 1.9,1.10 -k 1.11,1.12 

-k 옵션은 "정렬 키"를 정의)

파일 이름의 길이가 다른 경우 밑줄을 필드 구분 기호 (-t 옵션 사용)로 정의한 다음 세 번째 필드의 열을 주소 지정하는 것이 좋습니다. .

자세한 내용은 man sort을 참조하십시오. -r 옵션을 사용하면 내림차순으로 정렬 할 수 있습니다.

+0

고마워 데브, 당신은 정확하지만, 내 파일 이름 길이 (예를 들어, SSA_F12_05122013.request.done 및 SSA_F9_05122013.request.done), 나는 생각한다 우리는 파일 이름에 문자의 위치를 ​​진행하지 않습니다. 거기에 어떤 해결책이 있습니까 ?? –

+0

책임자를 다시 차고 나서,'sort -f '_'-k 3.5,3.8 -k 3.1,3.2 -k 3.3,3.4'를 사용할 수 있습니다. ('_'필드 구분 기호 만들기 및 세 번째 필드의 날짜, 즉 날짜 주소 지정) 테스트하지 않은 경고는 자체 위험 부담으로 사용하십시오 (또는 오히려 생산적인 데이터를 사용하기 전에 테스트하십시오). – DevSolar

+1

좋아요! 많은 도움이되었습니다. 감사. 그건 그렇고, seperator의 경우 -t가 아니라 -f입니다. –

관련 문제