주어진inputfile
Cherries:20:100:300
Beans:12:400:500
Tomatoes:32:445:234
Potatoes:24:400:200
Kiwis:23:230:435
다음과 같은 awk 스크립트가 있습니다 testscript.script
.
BEGIN{ FS = ":"
print "------------------------"
}
if($3 + $4 > 500) {print $1, $2}
END{
print "------------------------"
}
이 스크립트를 호출할 때의 출력 awk -f testscript.script inputfile
은 다음과 같습니다.
------------------------
Beans 12
Tomatoes 32
Potatoes 24
Kiwis 23
------------------------
이 목록을 알파벳순(이름 기준)으로 정렬한 다음 변수에 저장하고 싶습니다.엔드 블록어크 스크립트.
즉, 코드는 다음과 같아야 합니다.
BEGIN{ FS = ":"
print "------------------------"
}
*if($3 + $4 > 500) {print $1, $2 | "sort" = variable}
END{
print "------------------------"
print variable
}
이 print variable
명령은 생성됩니다
------------
------------
Beans 12
Kiwis 23
Potatoes 24
Tomatoes 32
정렬된 항목 목록을 변수로 만들고 점선 뒤의 END 블록에 인쇄합니다.
이를 수행하는 가장 좋은 방법은 무엇입니까?
답변1
echo "---------------";awk -F: '$3+$4>500{print $1,$2}' inputfile |sort && echo "---------------"
awk를 사용하세요
awk -F: '$3+$4>500{Arr[$1]=$2}END{n=asorti(Arr,SArr);for(i=1;i<=n;i++){print SArr[i],Arr[SArr[i]]}}' inputfile
답변2
"최상의" 방법을 고려할 때 고려해야 할 요소가 많이 있으며, 나는 최선이 내 필요에 가장 빠른 경로라고 생각합니다. 프로세스 범위 밖의 변수를 전달하려는 경우 해당 변수를 램 드라이브(거의 모든 배포판에 있음)에 연결한 다음 테스트를 처리하고 완료되면 해당 램디스크에서 내보내는 것이 좋습니다.
Debian 기반 배포판에서는 /run/shm에서 램 드라이브를 찾을 수 있으므로 비슷한 것이 사용자의 요구에 적합할 수 있습니다.
cat inputdata.file | sed 's/:/ /g' | awk '{print $1" "$2}' | sort -k 1,1 > /run/shm/datastore.file; echo '------------------------' > datastore2.file; cat /run/shm/datastore.file>>/run/shm/datastore2.file; cat /run/shm/datastore2.file>~/destination.file
프로세스가 수행하려는 방식이 제한적인 경우 논리 및 메모리 드라이브 제어를 사용하여 포맷하면 됩니다. /run/shm/*에 있는 모든 내용은 재부팅 시 삭제되므로 처리 후 데이터를 이동하는 것을 잊지 마세요. 이게 도움이 되길 바란다. 필요한 내용을 제가 잘못 이해한 경우를 대비해 주의 깊게 살펴보겠습니다.
답변3
당신은 할 수모든 것을 쉘 스크립트에 넣으십시오sort
인쇄하기 전에 Awk 출력을 파이프하십시오.
출력의 위와 아래에 있는 행을 정렬한다고 가정해 보겠습니다(이것이 시각적으로 더 의미가 있습니다).
#!/bin/sh
printf '%s\n' ------------------------
cat "$@" | awk -F: '($3 + $4 > 500) {print $1, $2}' | sort
printf '%s\n' ------------------------
myscript
set toexecutable이라는 파일에 저장하고 다음 inputfile
을 호출하여 지정한 파일에서 실행합니다.
./myscript inputfile
출력은 다음과 같습니다.
------------------------
Beans 12
Kiwis 23
Potatoes 24
Tomatoes 32
------------------------
"$@"
Awk처럼 스크립트가 하나가 아닌 여러 파일 매개변수를 처리할 수 있도록 사용에 유의하세요 .
cat
사용을 건너뛰고 다음을 수행 할 수도 있습니다 .
awk -F: '($3 + $4 > 500) {print $1, $2}' "$@" | sort
그러나 개인적으로 필요한 곳에 파일 이름을 전달하는 것을 좋아하지 않습니다.할 수 있다코드로 해석됩니다. 그래서 cat
파일을 연결하는 데 사용하겠습니다 .