awk 스크립트 본문의 변수에 명령 출력 파이핑

awk 스크립트 본문의 변수에 명령 출력 파이핑

주어진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
------------------------

이 목록을 알파벳순(이름 기준)으로 정렬한 다음 이 목록을 다음에서 인쇄할 수 있도록 변수에 저장하고 싶습니다.엔드 블록awk 스크립트의

즉, 코드는 다음과 같아야 합니다.

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

'최상의' 방법을 고려할 때 들어가는 것이 많을 때, 나는 내 요구 사항을 충족하는 가장 빠른 경로가 최선이라고 생각합니다. 프로세스 범위를 벗어나는 변수를 전달하려는 경우 램 드라이브에 변수를 전달하는 것이 좋습니다. 거의 모든 배포판에는 하나가 있으며 테스트를 처리하고 완료된 후 해당 램디스크에서 파이프아웃합니다.

데비안 기반 배포판에서는 램 드라이브가 /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이것을 실행 가능 파일로 저장 하고 inputfile다음을 호출하여 지정한 파일에서 실행합니다.

./myscript inputfile

출력은 다음과 같습니다.

------------------------
Beans 12
Kiwis 23
Potatoes 24
Tomatoes 32
------------------------

"$@"이 스크립트가 Awk가 처리할 수 있는 방식과 마찬가지로 하나가 아닌 여러 파일 인수를 처리할 수 있도록 를 사용하는 점에 유의하세요 .

사용을 건너뛰고 다음을 수행할 수도 있습니다 cat.

awk -F: '($3 + $4 > 500) {print $1, $2}' "$@" | sort

그러나 나는 개인적으로 파일 이름이 있는 곳에 파일 이름을 전달하는 것을 좋아하지 않습니다.~할 수 있었다코드로 해석됩니다. 그래서 cat파일을 연결하는 데 사용합니다 .

관련 정보