linux sed awk命令结合匹配符 根据第二行内容,替换第一行内容 可以写成shell脚本
大家好,我有这样一个文本处理的需求:内容为文本文件第一行Date1,Date2,MyCode.Mycode2第二行2015/9/1,2015/9/3017:10:01,h...
大家好,我有这样一个文本处理的需求:
内容为文本文件
第一行 Date1,Date2,MyCode.Mycode2
第二行 2015/9/1,2015/9/30 17:10:01,helloworld1,A
第三行 2015/9/1,2015/9/30 17:10:01,helloworld2,B
····
·····
判断第二行以逗号分隔的字符串,
如果是2015/09/01格式,则将第一行对应位置的字符串输出为Date1 "to_date(:Date1,'yyyy-mm-dd')"
如果是2015/09/30 17:10:01格式,则将第一行对应位置的字符串输出为Date2 "to_date(:Date2,'yyyy-mm-dd,hh24:mi:ss')"
总之要实现输出Date1 "to_date(:Date1,'yyyy-mm-dd')",Date2"to_date(:Date2,'yyyy-mm-dd,hh24:mi:ss')".Mycode,Mycode2··· 这样的几个字段。
也就是说:一个excel导出为csv格式的文件被处理成文本,第一行是表的各字段,第二行至最后为其数据。因为存在时间日期格式的字符串,我想根据第二行的各分段字符串的判断,实现对第一行对应分段的字符串的更改/替换。
可以用for循环、if、sed数组等形式写成shell脚本,用的不多,写出来不是自己期望的输出,求指点 谢谢
非常感谢!awk这位朋友用的真是6666啊。
我想解释一下,请帮忙看看理解的对不对哈,我刚用awk/sed,不熟练。
'NR==1{···}1'---这个集合是只代表第一行记录吗?
getline var;split(var,a);这两个难道取的是第二行,并将var放入数组a?getline在这里怎么取的是第二行?还有就是:第一行中AAA,BBB,Date1,CCC,···Date2,MyCode,Mycode2···想更改的变量位置不确定时,当然,第二行之后对应位置是也变化哈,我想写成对第一行变量的一个遍历循环,然后输出如题目内容。我不知道awk中这样的循环能不能实现,不会用。如下文本:
然后将结果AAA, BBB, Date1 "to_date(:Date1,'2015/9/1')", CCC, Date2 "to_date(:Date2,'2015/9/30 17:10:01')",MyCode,Mycode2输出至文本。
麻烦大神点时间,帮忙解答,万分感谢。
祝工作顺利! 展开
内容为文本文件
第一行 Date1,Date2,MyCode.Mycode2
第二行 2015/9/1,2015/9/30 17:10:01,helloworld1,A
第三行 2015/9/1,2015/9/30 17:10:01,helloworld2,B
····
·····
判断第二行以逗号分隔的字符串,
如果是2015/09/01格式,则将第一行对应位置的字符串输出为Date1 "to_date(:Date1,'yyyy-mm-dd')"
如果是2015/09/30 17:10:01格式,则将第一行对应位置的字符串输出为Date2 "to_date(:Date2,'yyyy-mm-dd,hh24:mi:ss')"
总之要实现输出Date1 "to_date(:Date1,'yyyy-mm-dd')",Date2"to_date(:Date2,'yyyy-mm-dd,hh24:mi:ss')".Mycode,Mycode2··· 这样的几个字段。
也就是说:一个excel导出为csv格式的文件被处理成文本,第一行是表的各字段,第二行至最后为其数据。因为存在时间日期格式的字符串,我想根据第二行的各分段字符串的判断,实现对第一行对应分段的字符串的更改/替换。
可以用for循环、if、sed数组等形式写成shell脚本,用的不多,写出来不是自己期望的输出,求指点 谢谢
非常感谢!awk这位朋友用的真是6666啊。
我想解释一下,请帮忙看看理解的对不对哈,我刚用awk/sed,不熟练。
'NR==1{···}1'---这个集合是只代表第一行记录吗?
getline var;split(var,a);这两个难道取的是第二行,并将var放入数组a?getline在这里怎么取的是第二行?还有就是:第一行中AAA,BBB,Date1,CCC,···Date2,MyCode,Mycode2···想更改的变量位置不确定时,当然,第二行之后对应位置是也变化哈,我想写成对第一行变量的一个遍历循环,然后输出如题目内容。我不知道awk中这样的循环能不能实现,不会用。如下文本:
然后将结果AAA, BBB, Date1 "to_date(:Date1,'2015/9/1')", CCC, Date2 "to_date(:Date2,'2015/9/30 17:10:01')",MyCode,Mycode2输出至文本。
麻烦大神点时间,帮忙解答,万分感谢。
祝工作顺利! 展开
1个回答
追问
麻烦大神点时间,帮忙看下我继续追问的内容,抽时间解答,万分感谢。
$ more c.txt
AAA,BBB,Date1,CCC,Date2,MyCode,Mycode2
111,222,2015/9/1,333,2015/9/30 17:10:01,helloworld1,A
aaa,bbb,2015/9/1,ccc,2015/9/30 17:10:01,helloworld2,B
追答
cat c.txt |awk -v FS=',' -v OFS=',' 'NR==1{getline var;split(var,a);for(i=1;i<=NF;i++){if($i~/Date1/ || $i~/Date2/) $i=$i" \"to_date(:"$i",\x27"a[i]"\x27)\"";};print $0; }'
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询