2017-05-24 18 views
0

複数のCSVファイルがあります(すべての行と列の数が同じです)。各ファイルの形式は次のとおりです。awk:複数のcsvファイルの列を1つのcsvファイルに追加する

1 100.23 1 102.03 1 87.65 
2 300.56 2 131.43 2 291.32 
. .  . .  . . 
. .  . .  . . 
200 213.21 200 121.81 200 500.21 

2列目、4列目、6列目を抽出し、1つのCSVファイルに追加する必要があります。 私は、すべてのCSVファイルを経由する私のシェルスクリプトでループを持つ列を抽出し、単一のファイルにこれらの列を追加:

1 100.23 102.03 87.65 219.42 451.45 903.1 ... 542.12 321.56 209.2 
2 300.56 131.43 291.32 89.57 897.21 234.52  125.21 902.25 254.12 
. .  .  .  .  .  .   .  .  .  
. .  .  .  .  .  .   .  .  . 
200 213.23 121.81 500.21 231.56 5023.1 451.09 ... 121.09 234.45 709.1 

:これは、この出力を生成し実行

#output header column 
awk -F"," 'BEGIN {OFS=","}{ print $1; }' "$input" > $output 

for f in "$1"*.csv; 
do 
    if [[ -f "$f" ]] #removes symlinks (only executes on files with .csv extension) 
    then 
     fname=$(basename $f) 
     arr+=("$fname") #array to store filenames 
     paste -d',' $output <(awk -F',' '{ print $2","$4","$6; }' "$f") > temp.csv 
     mv temp.csv "$output" 
    fi 
done 

私の所望の出力は次のようになります1つのCSVファイルです:つまり

 1.csv 1.csv 1.csv 2.csv 2.csv 2.csv ... 700.csv 700.csv 700.csv 
1 100.23 102.03 87.65 219.42 451.45 903.1  542.12 321.56 209.2 
2 300.56 131.43 291.32 89.57 897.21 234.52  125.21 902.25 254.12 
. .  .  .  .  .  .   .  .  .  
. .  .  .  .  .  .   .  .  . 
200 213.23 121.81 500.21 231.56 5023.1 451.09 ... 121.09 234.45 709.1 

、私はワットを識別するために、ファイル名を含むヘッダ行を必要としますファイルが列から抽出されたファイルです。私はこれを行う方法の周りに私の頭を包んでいるように見えることはできません。

これを達成する最も簡単な方法は何ですか(できればawkを使用します)。 ファイル名を配列に格納し、ヘッダ行を挿入して配列を出力することを考えていましたが、構文を理解できません。

+0

HTH awkのファイル名。 – Mischa

+0

@ミシャ私が正しく理解していれば、私が書いたループはすでにこれを行い、単一のcsvファイルを作成すると信じています。その後、ファイル名を格納するヘッダー行を挿入する必要がある問題が発生します。 – Jason

答えて

0

そうでは、いくつかの仮定に基づいて:

  • 入力が「*の.CSV」と呼ばれているが、それらは表示される彼らが、実際には空白で区切られています。
  • 奇数入力列だけ行番号を3回繰り返し、
  • 無視できる列見出しは、単にファイル名であり、それらはいくつかの他のプログラムへの入力、及び数値である3回ずつ
  • 繰り返し左詰めされている、とにかく、あなたが列について、特定されないように、コードのPREの書式が

    ここに私のために働いていないので、

ハンブル謝罪(...、整列DECIMALS、列が並ん)の書式設定

f=$(set -- *.csv; echo $*)

(echo $f; paste $f) |

awk 'NR==1 { for (i=1; i<=NF; i++) {x=x" "$i" "$i" "$i} }

NR > 1 { x=$1; for (i=2; i<= NF; i+=2) {x=x" "$i} }

{print x}'

あなたは、その後、最初に一緒にすべてのファイルを貼り付けた結果、プラスリストのを渡して検討する必要があります

関連する問題