![awk를 사용하여 여러 열을 기반으로 csv 파일의 여러 열을 전치](https://linux55.com/image/177001/awk%EB%A5%BC%20%EC%82%AC%EC%9A%A9%ED%95%98%EC%97%AC%20%EC%97%AC%EB%9F%AC%20%EC%97%B4%EC%9D%84%20%EA%B8%B0%EB%B0%98%EC%9C%BC%EB%A1%9C%20csv%20%ED%8C%8C%EC%9D%BC%EC%9D%98%20%EC%97%AC%EB%9F%AC%20%EC%97%B4%EC%9D%84%20%EC%A0%84%EC%B9%98.png)
이전 태그에서는 awk 일반 코드를 사용하여 csv 열을 유지하겠습니다. 답변이 제공되었습니다.여기작성자: @steeldriver.
다음으로 csv 파일의 일부 열을 전치하여 새 열을 얻고 싶습니다.
데이터에 대한 설명은 다음과 같습니다.
입력에서 첫 번째 줄에는 국가(여러 필드가 비어 있음)가 포함되고 두 번째 줄에는 처리할 제목이 포함됩니다.
전치된 열은 국가를 기준으로 마지막 빈 열로 시작됩니다. 국가마다 열 개수가 다른 것은 아닙니다. 2개 또는 20개의 국가 열이 있을 수 있습니다.
예:
- 입력하다:
file.csv
,,,fr,ch num,nom,date reg,match flag_fr,match flag_ch 0001,AA,2020-05-15,reg1_fr,reg2_ch 0002,AAA,2020-05-20,,reg3_ch
- 산출:
file1.csv
num,nom,date reg,match flag,country 0001,AA ,2020-05-15,reg1_fr,fr 0002,AAA,2020-05-20, _fr,fr 0001,AA ,2020-05-15,reg2_ch,ch 0002,AAA,2020-05-20,reg3_ch,ch
나는 다음을 사용했다암호, 결과는 정확하지만 모든 다른 필드를 수동으로 선언해야 합니다. 예:
awk -F, '
BEGIN{OFS=FS}
NR==2{n = split($0,a); print "num,nom,date reg,match country,flag"; next}
{for(i=4;i<=NF;i++) if (a[i] !=""){ print $1,$2,$3,a[i],$i} }
' < file.csv>file1.csv
결과file1.csv
num,nom,date reg,match country,flag
0001,AA,2020-05-15,match flag_fr,reg1_fr
0001,AA,2020-05-15,match flag_ch,reg2_ch
0002,AAA,2020-05-20,match flag_fr,
0002,AAA,2020-05-20,match flag_ch,reg3_ch
가능하다면 일반 awk
코드를 사용하여 어떻게 이를 수행할 수 있습니까?
답변1
$ cat tst.awk
BEGIN { FS=OFS="," }
NR==1 {
for (numHdrs=1; numHdrs<=NF; numHdrs++) {
if ( $numHdrs != "" ) {
break
}
}
numHdrs--
next
}
{
hdr = ""
for (i=1; i<=numHdrs; i++) {
hdr = hdr $i OFS
}
}
NR == 2 {
for (i=numHdrs+1; i<=NF; i++) {
country[i] = $i
}
print hdr "match flag", "country"
next
}
{
for (i=numHdrs+1; i<=NF; i++) {
print hdr country[i], $i
}
}
.
$ awk -f tst.awk file.csv
num,nom,date reg,match flag,country
0001,AA,2020-05-15,match flag_fr,reg1_fr
0001,AA,2020-05-15,match flag_ch,reg2_ch
0002,AAA,2020-05-20,match flag_fr,
0002,AAA,2020-05-20,match flag_ch,reg3_ch