使用 Linux 进行文本处理

使用 Linux 进行文本处理

我需要编写一个 Linux 程序,它从 csv 文件读取部分数据并按以下模式写入文本文件。

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解决方案(针对您当前的输入文件):

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

我假设文件的第一部分和第二部分中可能有更多的数据行(但不是列),并且行COLOR上的条目数应该COLOR与文件中的数据值FROMTO行数一样多。输出。

块会跳过非数字行!/^[0-9]/

输出中重复的数据由第三个块 ( ) 拾取$3 == ""。该块创建一个data和 一个col具有适当值的字符串。使用sprintf()指定不带小数位的浮点数的格式执行舍入。

最小值和最大值是从输入文件的后面部分中选取的,作为第二列的最小值和第三列的最大值。

END块打印出结果报告。

相关内容