각 레코드 라인에 인쇄될 매개변수 범위를 지정합니다.

각 레코드 라인에 인쇄될 매개변수 범위를 지정합니다.

다음과 같은 샘플 데이터가 있습니다.

EMP_ID|EMP_NAME|AGE|SALARAy|DepId|DepName
123456|XXXXXXXXX|30|10000000|1234|XYZWE

다음 코드를 사용하여 아래와 같이 데이터를 분할하고 있습니다.

awk -F\| '
BEGIN { print "EMP_ID|Values|HeaderName" }
NR==1 { for(i=3;i<=NF;i++) h[i]=$i }
NR>1 { for(i=3;i<=NF;i++) print $1"|"$2"|"$i"|"h[i] }
' records.txt 

그리고 출력 IS

EMP_ID|EMP_NAME|Values|HeaderName
12345|XXXXXXXXX|30|AGE
12345|XXXXXXXXX|10000000|SALARY
12345|XXXXXXXXX|1234|DepID
12345|XXXXXXXXX|XYZWE|DepName

명령에서 첫 번째와 두 번째 열부터 $i 및 h[i]를 추가하여 """ print $1"|"$2"|"$i"|"h[i] """를 지정했습니다. $1,$2를 지정하는 대신 더 많은 열이 있으므로 $1"|"$2"|"$3"|"$4...라는 언급이 발생합니다.

모든 열 이름을 순서대로 유지하는 대신 모든 범위를 언급할 수 있습니다. 나는 성공하지 않고 다음 명령을 시도했습니다.

for i in ${@:1:4}

$1"|"$2"|"$3"|"$4...를 유지하는 대신 1:4 등 원하는 범위를 지정할 수 있습니다.

답변1

$ awk -F'|' '
    BEGIN {
      getline; split($0,a); OFS=FS; 
      print "EMP_ID", "EMP_NAME", "Values", "HeaderName"
    } 
    {
      for (i=3;i<=NF;i++) print $1, $2, $i, a[i];
    }
' sample
EMP_ID|EMP_NAME|Values|HeaderName
123456|XXXXXXXXX|30|AGE
123456|XXXXXXXXX|10000000|SALARAy
123456|XXXXXXXXX|1234|DepId
123456|XXXXXXXXX|XYZWE|DepName

출력 필드의 범위를 동일한 헤더 필드 수로 제한하려면 split($0,a)로 변경한 n = split($0,a)다음 for루프 종료 조건을 i<=n대신 으로 변경합니다 i<=NF. 또는 원하는 경우 고정된 숫자로 변경하세요.

답변2

다음과 같은 구조를 사용하여 일련의 열에 있는 데이터를 인쇄할 수 있습니다.

echo {0..9} | awk '{ for(i=3;i<8;i++) {printf $i"|"} }'

산출:

2|3|4|5|6|

관련 정보