다음과 같은 샘플 데이터가 있습니다.
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|