*.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
내부 $1
및 alarms
교환 ) 만 사용하십시오 $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
인라인 변경을 하고 awk
4.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