인쇄 모드를 awk에 변수로 전달

인쇄 모드를 awk에 변수로 전달

변수를 사용하여 awk개별 열을 ,. 인쇄하려는 열과 패턴은 다른 변수에 저장됩니다 b. 패턴 a과 인쇄는 b다음과 같습니다.

a='15986327,415532694,850257614,875121642,20140819'
b='$1","$2","$4'

다음 출력을 얻으려고합니다.

15986327,415532694,875121642

b스위치를 사용하여 패턴을 awk에 전달하려고 하는데 내부에서 사용하는 -v방법을 잘 모르겠습니다 . 다음 명령을 시도했지만 이것은 내가 얻고 싶은 출력이 아닙니다.printawk

echo $a |awk -v ba="${b}" -F"," '{print ba}'
$1","$2","$4

echo $a |awk -v ba="${b}" -F"," '{print $ba}'
15986327,415532694,850257614,875121642,20140819

답변1

변수를 사용할 필요는 없습니다 ba. 다음을 시도해 보십시오.

$ echo $a | awk -F',' '{print '"$b"'}'
15986327,415532694,875121642

이 방법은 $b가 아닌 쉘에 의해 확장됩니다 awk. 나머지 명령문은 awk작은따옴표로 묶여 있으므로 영향을 받지 않습니다.

답변2

awk변수는 대부분의 언어의 변수와 마찬가지로 해당 값에만 사용되며 표현식으로 다시 구문 분석되지 않습니다. 이것으로 원하는 것을 할 수 있습니다:

a='15986327,415532694,850257614,875121642,20140819'
echo $a | awk -F, -v OFS=, '{print $1, $2, $4}'

OFS( 출력에 쉼표가 표시되도록 설정하십시오 ). b변수로 필요한 경우 다음을 사용할 수 있습니다.

b='$1, $2, $4'
echo $a | awk -F, -v OFS=, "{print $b}"

대신 b표현식의 일부로 in 을 대체합니다 awk.


말했듯이, 당신은 awk이것이 필요하지 않습니다. 정말 직업이야cut:

echo "$a" | cut -d, -f1,2,4

,코드를 복잡하게 이중 구문 분석할 필요 없이 필드 구분 기호 로 사용할 필드 1, 2, 4를 선택합니다 . 이것이 바로 cut우리가 설계한 목적입니다.

관련 정보