여러 열에 일부 데이터가 포함된 CSV 파일이 있습니다. 실제 데이터는 행 11에서 시작하고 모든 열은 행 11의 데이터로 채워집니다. 다음 4개 행에서 처음 4개 열(ABCD)은 비어 있으므로 11행의 ABCD 열에 있는 데이터를 12, 13, 14, 15행에 복사해야 합니다. (11-15행)
3706-3710까지 16-20, 21-25 등 5줄마다 반복해야 합니다. (16행의 abcd열 데이터가 17~20행에 복사되는 등)
마지막 항목은 3706 - 3710행에 있습니다.
아래 예제 파일에서:
hello hello hello hello
hello hello hello hello
hello hello hello hello
hello hello hello hello
hello hello hello hello
hello hello hello hello
hello hello hello hello
hello hello hello hello
hello hello hello hello
hello hello hello hello
colA,colB,colC,colD,colE,colF
,,,,colE,colF
,,,,colE,colF
,,,,colE,colF
,,,,colE,colF
colA,colB,colC,colD,colE,colF
,,,,colE,colF
,,,,colE,colF
,,,,colE,colF
,,,,colE,colF
colA,colB,colC,colD,colE,colF
,,,,colE,colF
,,,,colE,colF
,,,,colE,colF
,,,,colE,colF
colA,colB,colC,colD,colE,colF
,,,,colE,colF
,,,,colE,colF
,,,,colE,colF
,,,,colE,colF
colA,colB,colC,colD,colE,colF
,,,,colE,colF
,,,,colE,colF
,,,,colE,colF
,,,,colE,colF
colA,colB,colC,colD,colE,colF
,,,,colE,colF
,,,,colE,colF
,,,,colE,colF
,,,,colE,colF
파일 끝까지 ABCD 열의 값을 다음 4개 행에 복사해야 합니다.
답변1
다음 입력 파일이 주어지면:
junk
junk
junk
junk
junk
junk
junk
junk
junk
junk
dataA,dataB,dataC,dataD,dataE,dataF
,,,,dataX,dataY
,,,,dataX,dataY
,,,,dataX,dataY
,,,,dataX,dataY
dataG,dataH,dataI,dataJ,dataK,dataL
,,,,dataX,dataY
,,,,dataX,dataY
,,,,dataX,dataY
,,,,dataX,dataY
dataM,dataN,dataO,dataP,dataQ,dataR
,,,,dataX,dataY
,,,,dataX,dataY
,,,,dataX,dataY
,,,,dataX,dataY
이것은 트릭을 수행하는 것 같습니다
$ awk 'BEGIN {FS=","; OFS=","} NR<11 {next} (NR-11)%5==0 { d1=$1;d2=$2;d3=$3;d4=$4 } (NR-11)%5 { print d1,d2,d3,d4,$5,$6}' input2
dataA,dataB,dataC,dataD,dataX,dataY
dataA,dataB,dataC,dataD,dataX,dataY
dataA,dataB,dataC,dataD,dataX,dataY
dataA,dataB,dataC,dataD,dataX,dataY
dataG,dataH,dataI,dataJ,dataX,dataY
dataG,dataH,dataI,dataJ,dataX,dataY
dataG,dataH,dataI,dataJ,dataX,dataY
dataG,dataH,dataI,dataJ,dataX,dataY
dataM,dataN,dataO,dataP,dataX,dataY
dataM,dataN,dataO,dataP,dataX,dataY
dataM,dataN,dataO,dataP,dataX,dataY
dataM,dataN,dataO,dataP,dataX,dataY
awk
스크립트를 분석합니다 .
BEGIN {
FS="," # Set the field separators for
OFS="," # input and output for CSV data
}
NR<11 {next} # Skip the first ten lines of the file
(NR-11)%5==0 { # On every fifth line after the tenth,
d1=$1 # Use variables to hold the data values
d2=$2 # which are to be copied to the next
d3=$3 # few rows of output
d4=$4
}
(NR-11)%5 { # On all non such lines after the tenth,
# Print the data, substituting the data held from the marker lines
print d1,d2,d3,d4,$5,$6
}
답변2
돕고티의 답변아주 좋지만
- 입력 라인 11, 16, 21, ...을 인쇄하지 않습니다. 비록 질문에서 그렇게 말하지는 않지만 제 해석으로는 이 라인이 인쇄되어야 한다는 것입니다. 특히 첫 번째 단락 끝에 "11-15행"이 언급되어 있기 때문입니다.
- #6 이후의 입력 필드는 처리하지 않습니다. 질문에 나와 있지만하나예입력 파일의 행에는 6개의 필드만 있고 이 제약 조건을 선언하지 않으며(단지 "몇 개의 열에 있는 데이터"를 의미함) 실제 데이터가 예제와 정확히 같다고 항상 가정해서는 안 된다고 생각합니다.
그래서 내 수정 사항은 다음과 같습니다.
awk 'BEGIN {FS=","; OFS=","} NR<11 {next} (NR-11)%5==0 { d1=$1;d2=$2;d3=$3;d4=$4 }
(NR-11)%5 { $1=d1;$2=d2;$3=d3;$4=d4 } {print}'
이것
- 명령문을 별도의 작업 블록으로 이동하면
print
11, 16, 21… 행이 인쇄됩니다. - 12, 13, 14, 15, 17, 18, 19, 20행 등의 ,
$1
및$2
(비어 있을 것으로 예상되는 필드 )를 11, 16, 21행( , 및 )에 저장된 값으로 덮어씁니다$3
. .필드 수를 포함하여 전체(수정된) 행을 인쇄합니다.$4
d1
d2
d3
d4
예를 들어, 보다 흥미로운 예제 파일은 다음과 같습니다.
The
quick
brown
fox
jumps
high,over
the
very,very lazy
dog
catcher.
1,Hydrogen,1.00794(7),2.2,First Ionization Energy (eV),13.59844
,,,,Atomic Radius,25,apple
,,,,Van der Waals Radius,120
,,,,Covalent Radius,38
,,,,Valence electrons,1
2,Helium,4.002602(2),no data,First Ionization Energy (eV),24.58741
,,,,Atomic Radius,31,cherry
,,,,Van der Waals Radius,140
,,,,Covalent Radius,32
,,,,Valence electrons,2
3,Lithium,6.941(2),0.98,First Ionization Energy (eV),5.39172
,,,,Atomic Radius,145,banana cream
,,,,Van der Waals Radius,182
,,,,Covalent Radius,134
,,,,Valence electrons,1
(데이터는 다음에서 가져옴위키피디아, 그리고 라인 12, 17, 22에 파이 맛을 추가하면 내 명령은 다음을 생성합니다.
1,Hydrogen,1.00794(7),2.2,First Ionization Energy (eV),13.59844
1,Hydrogen,1.00794(7),2.2,Atomic Radius,25,apple
1,Hydrogen,1.00794(7),2.2,Van der Waals Radius,120
1,Hydrogen,1.00794(7),2.2,Covalent Radius,38
1,Hydrogen,1.00794(7),2.2,Valence electrons,1
2,Helium,4.002602(2),no data,First Ionization Energy (eV),24.58741
2,Helium,4.002602(2),no data,Atomic Radius,31,cherry
2,Helium,4.002602(2),no data,Van der Waals Radius,140
2,Helium,4.002602(2),no data,Covalent Radius,32
2,Helium,4.002602(2),no data,Valence electrons,2
3,Lithium,6.941(2),0.98,First Ionization Energy (eV),5.39172
3,Lithium,6.941(2),0.98,Atomic Radius,145,banana cream
3,Lithium,6.941(2),0.98,Van der Waals Radius,182
3,Lithium,6.941(2),0.98,Covalent Radius,134
3,Lithium,6.941(2),0.98,Valence electrons,1
1-10행을 인쇄해야 하는지 여부가 명확하지 않습니다. 그렇다면 NR<11 {next}
( NR<11 {print; next}
내 명령이나 DopeGhoti의 명령에서)로 변경하세요.