2016-03-24 8 views
0

によると、CSVデータに付加価値を追加するはのは、私は、ファイル名の形式の次の型を持っていると言うファイル名

.... 
"12-02-1984",3.8,4.1,3.8,3.8,3.8,3.7,4.1,4.3,3.8,4.1,5.0,4.8,4.5,4.3,4.3,4.3,4.1,4.5,4.3,4.3,4.3,4.5,4.3,4.1 
"13-02-1984",3.7,4.3,4.3,4.3,4.1,4.3,4.5,4.8,4.8,5.0,5.2,5.0,5.2,5.2,5.2,4.8,4.8,4.8,4.8,4.8,4.8,4.8,4.5,4.3 
"14-02-1984",3.8,4.1,3.8,3.8,3.8,3.8,3.8,4.2,4.5,4.5,4.1,3.6,3.6,3.4,3.4,3.2,3.4,3.2,3.2,3.2,2.9,2.7,2.5,2.2 
"15-02-1984",2.2,2.2,2.0,2.0,2.0,1.8,2.1,2.6,2.6,2.5,2.4,2.4,2.4,2.5,2.7,2.7,2.6,2.6,2.7,2.6,2.8,2.8,2.8,2.8 
.......... 

今私も.shこれらのファイルをすべて.datファイルを1つの出力.datファイルにマージできるファイルがあります。

for filename in `ls CO#*`; do 
    cat $filename >> CO#combined.dat 
done 

ここに問題があります。私はCO#combined.datの中の各行に、値の開始前に、filenameパラメータに従って '標準'値を持たせたいと思います。たとえば、ファイル名にATHの各ファイルには、各行の先頭に3,があり、ファイル名にはMARには22,が含まれています。

のでCO#combined.datはこのようなものでなければなりません:結論に私はスクリプトが上記の手順を実行したいので

.... 
3,"12-02-1984",3.8,4.1,3.8,3.8,3.8,3.7,4.1,4.3,3.8,4.1,5.0,4.8,4.5,4.3,4.3,4.3,4.1,4.5,4.3,4.3,4.3,4.5,4.3,4.1 
3,"13-02-1984",3.7,4.3,4.3,4.3,4.1,4.3,4.5,4.8,4.8,5.0,5.2,5.0,5.2,5.2,5.2,4.8,4.8,4.8,4.8,4.8,4.8,4.8,4.5,4.3 
20,"14-02-1984",3.8,4.1,3.8,3.8,3.8,3.8,3.8,4.2,4.5,4.5,4.1,3.6,3.6,3.4,3.4,3.2,3.4,3.2,3.2,3.2,2.9,2.7,2.5,2.2 
20,"15-02-1984",2.2,2.2,2.0,2.0,2.0,1.8,2.1,2.6,2.6,2.5,2.4,2.4,2.4,2.5,2.7,2.7,2.6,2.6,2.7,2.6,2.8,2.8,2.8,2.8 
.......... 

ありがとうございます!

答えて

2

awkを使用すると、組み込みのFILENAME変数を利用することができます。また、指定された呼び出しに複数のファイルを指定することもできます。 awkは各ファイルを順に処理し、レコードが現在読み取られているファイルの名前にFILENAMEを設定します。

これで、ファイル名で検索するパターンに応じて接頭辞を設定できます。最後に、接頭辞と元のレコードを印刷することができます。ここ

はあなたのサンプル入力の簡略化されたバージョンのデモです:ファイル名からコードATHまたはMARを抽出

$ cat CO\#ATH2000.dat 
1 
2 
3 

$ cat CO\#MAR2000.dat 
A 
B 
C 

$ awk 'FILENAME ~ /MAR/ {pre=22} FILENAME ~ /ATH/ {pre=3} { print pre "," $0 }' CO*.dat 
3,1 
3,2 
3,3 
22,A 
22,B 
22,C 
+0

このコードは疑問に答えるかもしれませんが、_context_を説明し、_how_を説明し、_when_を使用する方がよいでしょう。コードのみの回答は長期的には有用ではありません。 –

+1

@ベンジャミンW。 – jas

+0

魅力的な作品です! :) ありがとうございました! – Diaman

1

単に

for f in CO#*; do 
     case ${f:3:3} in 
      ATH) k=3 ;; 
      *) k=22 ;; 
     esac; 
     sed "s/^/$k,/" $f >> all; 
done 

$ {:3 3 F}を行うことができそれはbashの部分文字列関数です。 caseはコードを数値に変換します。 sedは各行の先頭に数値とカンマを挿入します。

+0

とてもいいです。私は 'ATH *ファイル名でATHを持つ各ファイル"の要件を満たすために 'case $ f in * ATH *)...'と書くでしょう。 –

+1

@sarriman、karakfaが示しているように、 'ls'を繰り返してはならないことに注意してください** http://mywiki.wooledge.org/ParsingLs –

+0

私はこのコードを完全には考えていません。 $ {f:3:3} 'はしますか?また、 'sed'は何をしますか? – Diaman

関連する問題