複数の列にいくつかのデータを含む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行、および(空になると予想されるフィールド)を11、16、21行(、
$1
および$2
)に格納されている値で上書きします$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のコマンドから)に変更してください。