我有一个CSV文件,我逐行读取了文件。
假设该行显示为:
10h50 10 15 20
我想得到的是:
<tr> <th scope="row">10h50</th> <td>10</td> <td>15</td> <td>20</td> </tr>
我开始了一些尝试,但不确定这是否是最好的方法。
我的文件result.csv
带有:
10h50,10,15,20
10h51,11,15,22
10h52,12,16,30
想法是:
cat result.csv | sed 's/,/ /g' > temp.csv
然后:
awk '{print $1}' temp.csv > time.csv
awk '{print $2}' temp.csv > col1.csv
awk '{print $3}' temp.csv > col2.csv
awk '{print $4}' temp.csv > col3.csv
在time.csv
上
cat time.csv | sed 's/^/<tr> <th scope="row">/' | sed 's/$/<\/th> <\/tr>/' > new_time.csv
cat col1.csv | sed 's/^/<td>/' | sed 's/$/<\/td>' > new_col1.csv
cat col2.csv | sed 's/^/<td>/' | sed 's/$/<\/td>' > new_col2.csv
cat col3.csv | sed 's/^/<td>/' | sed 's/$/<\/td>' > new_col3.csv
然后:
paste new_date.csv new_col1.csv new_col2.csv new_col3.csv | column -s $'\t' -t > final_result.csv
有什么建议吗?
答案 0 :(得分:1)
如果您不介意循环/使用脚本,这非常简单。
输入csv result.csv
:
10h50,10,15,20
10h51,11,15,22
10h52,12,16,30
,bash脚本为:
#!/bin/bash
while IFS=, read -r col1 col2 col3 col4 || [ -n "$col1" ];
do
echo "<tr> <th scope=\"row\">$col1</ht> <td>$col2</td> <td>$col3</td> <td>$col4</td> </tr>"
done < result.csv
您将得到以下结果:
<tr> <th scope="row">10h50</ht> <td>10</td> <td>15</td> <td>20</td> </tr>
<tr> <th scope="row">10h51</ht> <td>11</td> <td>15</td> <td>22</td> </tr>
<tr> <th scope="row">10h52</ht> <td>12</td> <td>16</td> <td>30</td> </tr>
答案 1 :(得分:1)
在awk
中:
#! /usr/bin/env awk -F, -f
BEGIN {f="<tr> <th scope="row">%s</th> <td>%d</td> <td>%d</td> <td>%d</td> </tr>\n"}
{printf f, $1, $2, $3, $4}
赋予执行权限并像
那样调用myscript file.csv