Linux使用aw​​k和tee写入相同的文件:非常奇怪的行为

时间:2014-01-15 22:52:48

标签: bash awk tee

我试图做一些与众不同的事情,只是出于好奇而在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:~/$ 

2 个答案:

答案 0 :(得分:2)

您所做的是在awktee之间创建竞争条件。 awk进程正在打开1.csv进行阅读,而tee正在重定向到另一个进程中的1.csv

与竞争条件的性质一样,结果是随机的,取决于谁先到达那里。

要安全地执行此操作,您需要将其保存到新文件或使用sponge之类的工具。

答案 1 :(得分:2)

具有相同问题的小型自包含测试用例是:

cat file | tee > file

此管道由两部分并行运行。

cat file尝试打开并从文件中读取。

tee > file尝试截断文件。

根据文件是(部分)首先被读取还是截断,您将获得部分或全部数据,或者只获取空文件。