微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在Unix Shell脚本中写出意外的新行

您好,我正在尝试输出一个CSV文件,我不断获得我的string的一部分写入一个新的行。

整个脚本读取一个带有时间戳的CSV文件,将其转换,然后将Epoch时间作为新variables附加到行末,并输出文件

#!/bin/bash OLDIFS=$IFS IFS="," cat test.csv | while read Host AName Resource MName TimeStamp Integer_Value Epoch; do Epoch=$(date -d "$TimeStamp GMT" +%s) if [ -z "$Epoch" ] then (echo "$Host,$AName,$Resource,$MName,$TimeStamp,$Integer_Value,Epoch,";) >> target.csv else (echo "$Host,$Epoch,";) >> target.csv fi done

我试图设置一个头,然后写出附加的variables,expect,这只发生在新的值,它将附加的variables下降到一个新的行。

#Host,AName,Resource,MName,Actual Start Time,Integer Value,ABCD89A,Admin,shop,Stall Count,2014-01-06 09:00:00.0,1388998800,

代替

我怎样才能得到当前连接的屏幕会话名称

在目录中查找最旧的文件(recursion)

为什么忽略SIGTRAP不能使用asm?

奇怪的垂直线在emacs窗口的一边,而它最大化

SAP + Java:java.lang.NoClassDefFoundError:com.sap.conn.rfc.driver.CpicDriver

#Host,

当我移动订单时,它不会发生。 对不起,我知道这可能很简单,我是新的Unix脚本。

编辑

我现在已经将代码更改为:

#!/bin/bash OLDIFS=$IFS IFS="," while read Host AName Resource MName TimeStamp Integer_Value Epoch do Epoch=$(date -d "$TimeStamp GMT" +%s) if [ -z "$Epoch" ] then echo "$Host," else echo "$Host," fi done < test.csv > target.csv

而我仍然遇到同样的问题。

也作为一个额外的问题,如果有人知道我为什么得到:命令未finddate:无效date`实际开始TimeStamp GMT'运行date部分时,但它会产生正确的date和脚本运行。

有关内核中的workqueue的一些标志

clock_gettime是UTC时间还是本地时区?

如何更改键盘布局(X11 API解决scheme)

Android 2.1以编程方式卸载SDCard

如何获得在Linux中的两个文件间的差异(只有补充)

试试这个脚本:

IFS=[,$'r']; while read Host AName Resource MName TimeStamp Integer_Value Epoch do # ignore first line with headers [[ "$Host" == #* ]] && continue Epoch=$(date -d "$TimeStamp GMT" +%s) if [ -z "$Epoch" ]; then echo "$Host," fi done < test.csv > target.csv

它有两个不同的地方:

它将r作为字段分隔符,并不包含在读取变量中

它忽略了您的第一行是输入CSV文件标题

我会亲自使用awk这里是如何:

awk -F"," '{timestamp=$5; gsub(":"," ",timestamp); gsub("-",timestamp); EPOCH=(mktime(timestamp)*1000)} {print $0","EPOCH}' 1.csv

生产:

ABCD89A,2014-01-06 09:00:00,1388998800000

1班轮,做你所需要的一切:

只要你的时间戳是完全格式化的,那么awk中的gsum就是重新生成的:并且 – 从日期格式传递给mktime,产生时间戳,最后以秒为单位打印每行$ 0“,”EPOCH现在被转换时间价值

awk -F"," '{ timestamp=$5; gsub(":",timestamp); EPOCH=(mktime(timestamp)*1000) } { print $0","EPOCH }' your_File.csv

这里扩大了。

现在展开这个文件,这样你就可以通过awk解析这个文件,然后将输出文件重新输入到相同的文件中,就像这样:

cp 2.csv 1.csv cat 1.csv ABCD89A,0 ABCD89N,0 file="1.csv"; output=$(awk -F"," '{ timestamp=$5;gsub(":",timestamp);gsub("-",timestamp);EPOCH=(mktime(timestamp));}{print $0","EPOCH;}' $file 2>&1); echo "$output" > $file cat 1.csv ABCD89A,Admi,Stall Cou t,1388998800 ABCD89N,1388998800

现在展开这个方法,以确保你不会覆盖已经设置好的时间(以秒为单位)的文件,你可以像这样运行:

cp 2.csv 1.csv cat $file ABCD89A," '{ if (NF==7) { print "ERROR"; next; }else{timestamp=$5;gsub(":","EPOCH;}}' $file 2>&1); if echo "$output"|grep -q "ERROR"; then echo "$output"; else echo "$output" > $file; fi file="1.csv"; output=$(awk -F","EPOCH;}}' $file 2>&1); if echo "$output"|grep -q "ERROR"; then echo "$output"; else echo "$output" > $file; fi ERROR ERROR cat $file ABCD89A,1388998800

你会注意到在第二次运行它输出错误,并不实际覆盖相同的文件

这样,你可以自动化一些脚本来做,并做到这一点,并感到安全,它不会增加额外的东西,现有的csv的

或者使用一个临时文件来处理大量的csv文件:这是一个毫无意义的行我只是测试,如果我可以发球回到我发现在奇怪的场合工作的同一个文件 – 真是bizzare。

(awk -F","EPOCH;}' 1.csv 2>&1|tee /tmp/a; mv /tmp/a 1.csv;)

因为这可能是刚刚

(awk -F","EPOCH;}' 1.csv >/tmp/a; mv /tmp/a 1.csv;)

一个使用$ output的方法将csv作为变量存储到内存中,然后将其推回到文件中。 第二个或最后一个方法可能是/ tmp文件的最后一次尝试使用临时文件来处理。 我猜你选择的方法可能取决于您的CSV文件的大小。 如果我们正在说演唱会,而不是一个非常强大的机器,那么临时文件就是要走的路。 记忆显然更清洁,应该是最快的。

它只是我对此的投入 – 对于希望做类似事情的其他人来说,它可能会派上用场

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐