간단한 awk 래퍼 함수 또는 별칭

간단한 awk 래퍼 함수 또는 별칭

나는 사람들이 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큰따옴표 안에 실행할 수 있습니다 .$fieldsawk

이식성은 상당히 높아야 sed -E하지만 herestring( <<<"$1")은 이식성이 떨어집니다. 완전히 이식 가능한 버전의 경우 다음을 사용하십시오.

pawk(){
    fields="$(printf '$%s' $(echo 1,2,3 | sed 's/,/,\$/g'))"
    shift
    awk "{print $fields}" "$@"
}

관련 정보