2014-01-15 22 views
1

我試圖做一些不尋常的,並覆蓋上Unexpected new line when writing out in Unix Shell Script相同的文件這個問題,只是出於好奇Linux的寫入與AWK和T相同的文件:很奇怪的行爲

我發現了一些嘗試,我可以發球> to_same_file,它的工作原理可以在第一次嘗試時看到,然後隨後的嘗試產生一個空文件,我的假設是,這必須與處理時間有關。第一次嘗試的含義,需要更長的時間才能開球並且有時間到I/O,因爲它在其他嘗試中發生得更快,並且沒有機會及時寫入文件以及它已經讀取它..只是有興趣瞭解爲什麼發生這種奇怪的行爲

[email protected]:~/$ cp 2.csv 1.csv 
[email protected]:~/$ 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 
[email protected]:~/$ awk -F"," '{ 
    timestamp=$5; 
    gsub(":"," ",timestamp); 
    gsub("-"," ",timestamp); 
    EPOCH=(mktime(timestamp)) 
    } 
    { 
     print $0","EPOCH 
     }' 1.csv 2>&1 | tee > 1.csv 
[email protected]:~/$ 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 
[email protected]:~/$ cp 2.csv 1.csv 
[email protected]:~/$ 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 
[email protected]:~/$ awk -F"," '{ 
    timestamp=$5; 
    gsub(":"," ",timestamp); 
    gsub("-"," ",timestamp); 
    EPOCH=(mktime(timestamp)) 
    } 
    { 
     print $0","EPOCH 
     }' 1.csv 2>&1 | tee > 1.csv 
[email protected]:~/$ cat 1.csv 
[email protected]:~/$ cp 2.csv 1.csv 
[email protected]:~/$ awk -F"," '{ 
    timestamp=$5; 
    gsub(":"," ",timestamp); 
    gsub("-"," ",timestamp); 
    EPOCH=(mktime(timestamp)) 
    } 
    { 
     print $0","EPOCH 
     }' 1.csv 2>&1 | tee > 1.csv 
[email protected]:~/$ cat 1.csv 
[email protected]:~/$ cp 2.csv 1.csv 
[email protected]:~/$ 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 
[email protected]:~/$ awk -F"," '{ 
    timestamp=$5; 
    gsub(":"," ",timestamp); 
    gsub("-"," ",timestamp); 
    EPOCH=(mktime(timestamp)) 
    } 
    { 
     print $0","EPOCH 
     }' 1.csv 2>&1 | tee -a > 1.csv 
[email protected]:~/$ cat 1.csv 
[email protected]:~/$ 

回答

2

一個小的,自包含的測試用例同樣的問題是這樣的:

cat file | tee > file 

該管道由在平行運行兩個部分。

cat file嘗試打開並從文件中讀取。

tee > file嘗試截斷文件。

根據文件是(部分)讀取還是先截斷,您將獲得部分或全部數據,或者只是一個空文件。

+1

此外,'cat'打開'file'進行讀取,但shell打開(並截斷)''file'進行寫入。根據shell,設置重定向可能在命令行解析時發生,在這種情況下,它不會是競爭條件(因爲它是確定性的),但幾乎肯定不是所期望的行爲。 – rici

2

你所做的是創建一個awktee之間的競賽條件。 awk進程正在打開1.csv進行讀取,而tee正在重定向到另一進程中的1.csv

由於競爭條件的性質,結果是隨機的,取決於誰先到達那裏。

要安全地做到這一點,您需要將它保存到一個新文件或使用像sponge這樣的工具。

+0

感謝您解釋原因,我不知道海綿和安裝moreutils現在將閱讀。謝謝。 – Vahid