Linuxを使用したテキスト処理

Linuxを使用したテキスト処理

csvファイルから部分データを読み取り、次のパターンでテキストファイルに書き込むLinuxプログラムを作成する必要があります。

NAME : FROM= -100 -346 -249 -125 TO= -346 -249 -125 100 COLOR= COLOR1 COLOR2 COLOR3 COLOR4

NAMEは固定行になります。

FROMとTOの情報はcsvファイルから取得する必要があります。

色情報は、プログラム自体でハードコーディングされた色の配列です。

以下のcsvデータでは、MIN(-100)の下の最初の値はテキストファイルのFROMの下の最初の値(-100)になります。 Excel MAX列の最後の値(100)は、テキストファイルのTO列の下の最後の値(100)になります。 ExcelのVALUE列の下の値は丸められ、表示されているパターンごとにTOとFROMとして使用されます。

データ、価値、
100,-345.8756,
200,-249.3654,
300,-125.3554,
数、最小、最大
1,-100,-98
93,84,86
98,94,96
99,96,98
100,98,100

ここに画像の説明を入力してください。

答え1

アッ回避策(現在の入力ファイルの場合):

awk 'NR>1 && NR<5{ 
         v=sprintf("%.0f", $2); values=(values)? values FS v : v; 
         lbl="COLOR"; col_item=lbl""++c; col=(col)? col OFS col_item : col_item 
     }
     NR==6{ from=$2 }
     END{ 
         print "NAME :"; print "FROM=",from,values; 
         print "TO=",values,$3; print "COLOR=",col,lbl""++c 
     }' file

出力:

NAME :
FROM= -100 -346 -249 -125
TO= -346 -249 -125 100
COLOR= COLOR1 COLOR2 COLOR3 COLOR4

答え2

プログラムawk:

BEGIN           { FS = ","; col = "COLOR1"; i = 1 }
!/^[0-9]/       { next }

$3 == ""        {
                    val = sprintf("%.0f", $2)
                    data = data ? data OFS val : val
                    col = col OFS "COLOR" ++i
                    next
                }

$2 < min        { min = $2 }
$3 > max        { max = $3 }

END {
        printf("NAME:\nFROM= %s %s\nTO= %s %s\nCOLOR= %s\n",
               min, data, data, max, col)
    }

テストしてみてください:

$ awk -f script.awk file.csv
NAME:
FROM= -100 -346 -249 -125
TO= -346 -249 -125 100
COLOR= COLOR1 COLOR2 COLOR3 COLOR4

ファイルの最初の部分と2番目の部分にはより多くのデータ行(列ではない)があり、ファイル内のデータ値と行数だけ行にCOLOR項目があるとします。出力。COLORFROMTO

ブロックは数字ではなく行をスキップします!/^[0-9]/

出力の冗長データは3番目のブロック()によって選択されます$3 == ""。このブロックは適切な値を持つ文字列をdata生成します。小数点以下の桁数を指定せずに浮動小数点数を指定する形式をcol使用して丸めを実行します。sprintf()

最小値と最大値は、入力ファイルの後半の2番目の列の最小値と3番目の列の最大値として選択されます。

このENDブロックは結果レポートを印刷します。

関連情報