나는 사람들이 bash 별칭이나 awk 기반 함수를 사용하는 것을 보았고 그것의 단순성을 좋아하지만 (bash에서) 그것을 구현하는 방법을 기억할 수 없습니다.
열 3, 4, 7을 선택해야 하는 큰 형식의 파일이 있다고 가정해 보겠습니다.
이를 위해 다음을 수행할 수 있습니다.
cat bigfile.txt | awk '{print $3, $4, $7}' |less
다음과 같이 사용할 수 있는 별칭(또는 함수) Pawk가 필요합니다.
cat bigfile.txt | pawk 3,4,7 | less
같은 효과를 얻으려면. 열 수는 임의적일 수 있으며 NF를 포함할 수 있습니다. 이를 달성하기 위해 몇 가지 방법을 시도했지만 임의의 수의 변수를 awk에 전달하는 방법을 알 수 없습니다.
답변1
다음과 같은 기능을 사용할 수 있습니다.
function pawk(){
awkString="{print "
for var in "$@"
do
awkString+=" \$$var"
done
awkString+=" }"
awk "$awkString"
}
예:
cat bigfile.txt | pawk 3 4 7 | less
답변2
예, 아마도 별칭이 아닌 함수일 것입니다. 이를 염두에 두고 다음을 시도해 보십시오.
pawk(){
fields="$(sed -E 's/(^|,)/ \1\$/g'<<<"$1")"
shift
awk "{print $fields}" "$@"
}
그런 다음 실행할 수 있습니다.
pawk 3,4,7 bigfile.txt | less
또는
cat bigfile | pawk 3,4,7 | less
심지어
pawk 3,4,7 * | less
요령은 $
각 쉼표 앞과 함수의 첫 번째 매개변수 시작 부분에 a를 추가하고(즉, 가 1,2,3
됨 $1,$2,$3
) 결과 문자열을 쉘 변수에 저장하는 것입니다. 그런 다음 변수가 확장되어 인쇄되어야 하는 필드로 처리되도록 awk
큰따옴표 안에 실행할 수 있습니다 .$fields
awk
이식성은 상당히 높아야 sed -E
하지만 herestring( <<<"$1"
)은 이식성이 떨어집니다. 완전히 이식 가능한 버전의 경우 다음을 사용하십시오.
pawk(){
fields="$(printf '$%s' $(echo 1,2,3 | sed 's/,/,\$/g'))"
shift
awk "{print $fields}" "$@"
}