필드 값을 기준으로 파일 정렬

필드 값을 기준으로 파일 정렬

*.alarms.gz 및 *.values.gz로 끝나는 두 개의 필드가 있는 아래와 같은 파일이 있고 첫 번째 필드의 모든 Alarms.gz와 두 번째 필드의 모든 값과 같이 파일을 정렬하려고 합니다. 어떻게 해야 하나요?

입력 샘플

    20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
    20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
    20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
    20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
    20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
    20190412_92E9EA3400B1CF41.values.gz               20190412.alarms.gz
    20190412.alarms.gz              20190415_42E9EA3400B1CF41.values.gz
    20190412.alarms.gz              20190415_32E9EA3400B1CF41.values.gz
    20190412.alarms.gz              20190412_12E1EA3400B1CFA1.values.gz

원하는 출력

20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
20190412.alarms.gz              20190415_02E9EA3400B1CF41.values.gz
20190412.alarms.gz              20190412_92E9EA3400B1CF41.values.gz               
20190412.alarms.gz              20190415_42E9EA3400B1CF41.values.gz
20190412.alarms.gz              20190415_32E9EA3400B1CF41.values.gz
20190412.alarms.gz              20190412_12E1EA3400B1CFA1.values.gz

답변1

awk그리드 외부에 있는 일치하는 행(예: 열 값 values내부 $1alarms교환 ) 만 사용하십시오 $2. {..}1행 내에서 수정된 사항과 필드/레코드 구분 기호에 대한 변경 사항을 포함하여 {..}전체 행을 재구성합니다 .

awk '$1 ~ /.*values.gz/ && $2 ~ /.*alarms.gz/ { tmp = $1; $1 = $2; $2 = tmp }1' file | 
column -t

이 부분은 column -t그냥 예쁘게 인쇄하기 위한 부분입니다 awk. 적절한 너비를 사용하면 되지만 printf()이전 명령을 사용하면 작업이 더 쉬워집니다.

그러나 POSIX 불만 사항에만 awk사용하십시오.printf()

awk '$1 ~ /.*values.gz/ && $2 ~ /.*alarms.gz/ { tmp = $1; $1 = $2; $2 = tmp; } 
{ printf "%s%40s\n",$1,$2}' file

인라인 변경을 하고 awk4.1.2보다 낮은 GNU를 사용하는 경우 임시 파일을 사용하여 콘텐츠를

tmpfile=$(mktemp)

awk '$1 ~ /.*values.gz/ && $2 ~ /.*alarms.gz/ { tmp = $1; $1 = $2; $2 = tmp }1' file | 
column -t > "$tmpfile" && mv "$tmpfile" file

sponge또는 moreutils 패키지의 매직 도구를 사용하십시오(RHEL에서는 다음을 수행하십시오 yum install moreutils).

awk '$1 ~ /.*values.gz/ && $2 ~ /.*alarms.gz/ { tmp = $1; $1 = $2; $2 = tmp }1' file | 
column -t | 
sponge file

관련 정보