将周期线上的 CSV 字段复制到后续行系列中

将周期线上的 CSV 字段复制到后续行系列中

我有一个 CSV 文件,其中有几列中的一些数据。实际数据从第 11 行开始,所有列都填充有第 11 行中的数据。在接下来的 4 行中,前四列 (ABCD) 为空,我需要将第 11 行 ABCD 列中的数据复制到第 12、13 行、14 和 15。(第 11-15 行)

它需要每 5 行重复一次,即 16-20、21-25 等,直到 3706-3710。 (第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 列中的值复制到接下来的四行,直到文件末尾。

答案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 的输入字段。虽然问题表明一个例子输入文件中的行只有六个字段,它从未声明此约束(仅表示“几列中的数据”),并且我相信我们不应该总是假设真实数据与示例完全相同。

所以这是我的修改:

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 行……。
  • 使用第 11、16、21 行中保存的值( 、 和 )覆盖第12、13、14、15、17、18、19、20等行中的$1$2和(预计为空的字段$3)…,然后打印整个(修改后的)行,包括任意数量的字段。$4d1d2d3d4

例如,对于这个更有趣的示例文件:

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 的命令)。

相关内容