我试图做一些与众不同的事情,只是出于好奇而在Unexpected new line when writing out in Unix Shell Script这个问题上覆盖同一个文件
我发现在某些尝试中我可以开球> to_same_file,它就像你在第一次尝试中看到的那样工作,然后后续的尝试产生了一个空文件,我的假设是,这必须与处理时间有关。第一次尝试的含义需要更长的时间才能开球并有时间到i / o,因为它在其他尝试中发生得更快,并且没有机会及时写入文件,它已经阅读了它...只是有兴趣了解为什么会出现这种奇怪的行为
me@desktop:~/$ cp 2.csv 1.csv
me@desktop:~/$ cat 1.csv
ABCD89A, Admin, shop, Stall Count, 2014-01-06 09:00:00, 0
ABCD89N, Admin, shop, Stall Count, 2014-01-06 09:00:00, 0
me@desktop:~/$ awk -F"," '{
timestamp=$5;
gsub(":"," ",timestamp);
gsub("-"," ",timestamp);
EPOCH=(mktime(timestamp))
}
{
print $0","EPOCH
}' 1.csv 2>&1 | tee > 1.csv
me@desktop:~/$ cat 1.csv
ABCD89A, Admin, shop, Stall Count, 2014-01-06 09:00:00, 0,1388998800
ABCD89N, Admin, shop, Stall Count, 2014-01-06 09:00:00, 0,1388998800
me@desktop:~/$ cp 2.csv 1.csv
me@desktop:~/$ cat 1.csv
ABCD89A, Admin, shop, Stall Count, 2014-01-06 09:00:00, 0
ABCD89N, Admin, shop, Stall Count, 2014-01-06 09:00:00, 0
me@desktop:~/$ awk -F"," '{
timestamp=$5;
gsub(":"," ",timestamp);
gsub("-"," ",timestamp);
EPOCH=(mktime(timestamp))
}
{
print $0","EPOCH
}' 1.csv 2>&1 | tee > 1.csv
me@desktop:~/$ cat 1.csv
me@desktop:~/$ cp 2.csv 1.csv
me@desktop:~/$ awk -F"," '{
timestamp=$5;
gsub(":"," ",timestamp);
gsub("-"," ",timestamp);
EPOCH=(mktime(timestamp))
}
{
print $0","EPOCH
}' 1.csv 2>&1 | tee > 1.csv
me@desktop:~/$ cat 1.csv
me@desktop:~/$ cp 2.csv 1.csv
me@desktop:~/$ cat 1.csv
ABCD89A, Admin, shop, Stall Count, 2014-01-06 09:00:00, 0
ABCD89N, Admin, shop, Stall Count, 2014-01-06 09:00:00, 0
me@desktop:~/$ awk -F"," '{
timestamp=$5;
gsub(":"," ",timestamp);
gsub("-"," ",timestamp);
EPOCH=(mktime(timestamp))
}
{
print $0","EPOCH
}' 1.csv 2>&1 | tee -a > 1.csv
me@desktop:~/$ cat 1.csv
me@desktop:~/$
答案 0 :(得分:2)
您所做的是在awk
和tee
之间创建竞争条件。 awk
进程正在打开1.csv
进行阅读,而tee
正在重定向到另一个进程中的1.csv
。
与竞争条件的性质一样,结果是随机的,取决于谁先到达那里。
要安全地执行此操作,您需要将其保存到新文件或使用sponge
之类的工具。
答案 1 :(得分:2)
具有相同问题的小型自包含测试用例是:
cat file | tee > file
此管道由两部分并行运行。
cat file
尝试打开并从文件中读取。
tee > file
尝试截断文件。
根据文件是(部分)首先被读取还是截断,您将获得部分或全部数据,或者只获取空文件。