替换csv文件中的行

时间:2013-11-29 22:01:09

标签: bash csv sed awk

所以我有一个csv文件:

Today</span><span class='invisible'>3:00 p.m. Nov. 29, 2013
Today</span><span class='invisible'>1:52 p.m. Nov. 29, 2013
Today</span><span class='invisible'>12:50 p.m. Nov. 29, 2013
Today</span><span class='invisible'>11:42 a.m. Nov. 29, 2013
Today</span><span class='invisible'>9:56 a.m. Nov. 29, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 25, 2013

我需要替换以Today开头的所有行,并将其替换为当前行中的日期。到目前为止,我一直在运行for循环:

rownumber=$(wc -l < DateStamp.csv)
for ((i=1; i<=$rownumber; i++))
do
    s1=$(awk -v "row=$i" -F'@' 'NR == row { print $1 }' DateStamp.csv)
    if [[ "$s1" =~ 'Today' ]]
        then
            year=$(date +'%Y')
            text=$(awk -v "row=$i" -F'@' 'NR == row { print $1 }' DateStamp.csv | grep -o -P "(?<=m\. ).*(?<=$year)")
                            __SOME COMMAND__
        else
            break
    fi
done

我希望我的输出是这样的:

Nov. 29, 2013
Nov. 29, 2013
Nov. 29, 2013
Nov. 29, 2013
Nov. 29, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 25, 2013

是否有一行我可以用 SOME COMMAND 代替,它将用我的变量text替换我所在的行?可能是sedawk命令?

2 个答案:

答案 0 :(得分:2)

假设在日期前面存在a.m.p.m.,您真的需要解析并从Today行中提取日期吗?以下可能就足够了

sed 's/.*[ap]\.m\.\s\+\(.*\)$/\1/' DateStamp.csv

这使用捕获组\(.*\)来收集a.mp.m.之后的部分,并用此捕获组的内容替换整个输入行。 只是通过原始行

答案 1 :(得分:2)

您可以使用awk

轻松完成此操作
awk '/^Today/ {$0=$4 FS $5 FS $6}1' DateStamp.csv
Nov. 29, 2013
Nov. 29, 2013
Nov. 29, 2013
Nov. 29, 2013
Nov. 29, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 27, 2013
Nov. 25, 2013

如果行以Today开头,则将行设置为等于字段4,5和6.然后将所有内容打印出来。