2016-12-07 6 views
0

ここで見つけた質問と同じような状況があります。Split single column of csv horizontally in bash into multiple smaller csv files in BASH質問が別のファイルに分割されていました。私は同じファイルで同じようなことをする必要があります。csvファイルを行単位で分割して再編成する

私はbashを使用していますが、27行目までヘッダーを含むいくつかのcsvファイルを持っています。次に、1000行のデータ、別のヘッダー、さらに1000行のデータがあります。しかし、私はここに簡素化されます:

**row1** Begin of header 
... 
**row26** TASK1, TASK2, DV-T1, DV-T2 
**row27** --- End of header --- 
**row28** 1, 111, 1, 991, 1, 1.1, 1, 9.1 
**row29** 2, 112, 2, 992, 2, 1.2, 2, 9.2 
**row30** 3, 113, 3, 993, 3, 1.3, 3, 9.3 
... 
**row1028** 1000, 1128, 1000, 1028, 1000, 1.2, 1000, 10.2 
**row1029** Begin of 2nd Header 
... 
**row1039** End of 2nd header 
**row1040** 1, 0.1, 1, 0.9 
**row1041** 2, 0.2, 2, 0.8 
**row1042** 3, 0.3, 3, 0.7 
... 
**row2040** 1000, 0.6, 1000, 0.6 
**row2041** End of 2nd data 
**row2042** Performance, 0.87 
**row2043** End of file 

を私は1つのcsvファイルに行を分割するために探していますように:

for strategy in *; do 
    if [ -d "$strategy" ] ; then 
     cd $strategy 
     for file in *; do 
      if [ -f "$file" ] ; then 
       namefile=$(printf "${file/.csv/-output.csv}") 
       #printf "$namefile\n" 
       awk -F, 'BEGIN{print "task1, dev-task1, task2, dev-task2, FractionT1-T2, Difference"};NR > 27 && NR < 1029 { print $2 "," $6 "," $4 "," $8};NR > 1039 && NR < 2041 {print $2 "," $4 }' "$file" > "$namefile" 
      fi 
     done 
    cd .. 
    fi 
done 

**row1** task1, dev-task1, task2, dev-task2, FractionT1-T2, Difference 
**row2** 111, 1.1, 991, 9.1, 0.1, 0.9 
**row3** 112, 1.2, 992, 9.2, 0.2, 0.8 
**row4** 113, 1.3, 993, 9.3, 0.3, 0.7 
... 
**row1001** 1128, 1.2, 1028, 10.2, 0.6, 0.6 

これは私がしようとしたものですしかし、出力は最初のコマンド、すなわち

**row1** task1, dev-task1, task2, dev-task2, FractionT1-T2, Difference 
**row2** 111, 1.1, 991, 9.1 
**row3** 112, 1.2, 992, 9.2 
**row4** 113, 1.3, 993, 9.3 
... 
**row1001** 1128, 1.2, 1028, 10.2 
です。

どのように列を並べ替えることができますか?後者のマージに2つのファイルを作成する必要がありますか?-d "" output1.csv output2.csv> real-output.csv?出力ファイルの2行目としてラインパフォーマンス(row2042パフォーマンス、0.87)を移動することはできますか?

+0

いくつかの質問:ヘッダーを「認識」する方法はありますか?私。ヘッダーは常に同じ行、または正規表現で簡単に取り込める行で始まり、終わりますか? – chw21

+0

2番目の質問:データでは、常に正確に同じ数の列があり、事前に列の数を知っていますか? – chw21

+0

最後に、ある列を別の列に置き換えたいとしますか? – chw21

答えて

1

これは少し複雑なバージョンのawkスクリプトになりました。外部ファイルに移動することをお勧めします。

$ cat rearrange.awk 
BEGIN { 
    FS="," 
    OFS=FS 
    print "task1, dev-task1, task2, dev-task2, FractionT1-T2, Difference" 
} 

# First data block: Collect the tasks and dev-tasks 
NR > 27 && NR < 1029 { 
    task1[NR-27] = $2 
    task2[NR-27] = $4 
    dtask1[NR-27] = $6 
    dtask2[NR-27] = $8 
} 

# Second data block: Collect the fraction and differences 
NR > 1039 && NR < 2041 { 
    frac[NR-1039] = $2 
    diff[NR-1039] = $4 
} 

# If we find a line that contains the performance, print it. 
# Since we haven't printed anything beside the header yet, 
# This will be the second line. 
/Performance/ {print} 

# Reached the end of the file, now print everything. 
END { 
    for (i=1; i<=1001; i++) { 
     print task1[i], dtask1[i], task2[i], dtask2[i], frac[i], diff[i] 
    } 
} 
$ awk -f rearrange.awk $file > $namefile 

これはトリックを行う必要があります。基本的にawkはレコード単位で動作します。したがって、ファイルの2番目の部分に到達するまでに、すでに前のセクションを完全に処理しています。

ただし、値を配列に追加すると、最後に配列にアクセスできます。

+0

素晴らしい、素晴らしいソリューションchw21! – Jotasmall

関連する問題