Text-Processing
將兩個文件讀入 IFS while 循環——在這種情況下,有沒有辦法獲得零差異結果?
我有一個包含數百行序列的文本文件,如下所示:
b 29. b 52. 84. 83. 94. 93. 61. b 38. 81. 92. 28. 37. 27. lara@batcuter:~/.asd/a-new-way-of-studying-go$ wc -l game7 271 遊戲7
下面的腳本將一個文本文件分成兩個文件,其中一個由奇數行組成,一個由偶數行組成,然後將兩個文件讀入 while IFS 循環,從每個文件中列印一行一次:
#/bin/bash #testing liquor-where-twin-twas-born awk '{print>"line-"NR%2}' $@ while IFS= read -r lineA && IFS= read -r lineB <&3; do echo "$lineA"; echo "$lineB" done <line-1 3<line-0
不幸的是,它給出的東西與輸入文件不太一樣,因為一個文件比另一個文件長一行。
lara@batcuter:~/.asd/a-new-way-of-studying-go$ testing-liquor game7 > 測試 lara@batcuter:~/.asd/a-new-way-of-studying-go$ diff test game7 270a271 > b 7。
顯然,由於該文件有 271 行長,因此將其一分為二會產生兩個文件,一個是 136 行,另一個是 135 行。我需要修復 IFS while 循環以返回零差異。起初,我認為使用
read ... || read ...
會有所幫助。但實際上,這只是使輸出膨脹,在每個條目之間插入多個換行符,並削減最後一行(文件中以奇數行結束的行),就像我所有其他解決方案一樣試過了。
告訴那個建議
||
他是個白痴的人。Using||
使程式碼片段從fileA
first 讀取所有行,然後從 讀取所有行fileB
,因為只要read lineA
返回 true,read lineB
就不會執行。相反,呼叫read
兩次,保存返回狀態,然後測試返回狀態。while IFS= read -r lineA; statusA=$? IFS= read -r lineB; statusB=$? [ $statusA -eq 0 ] || [ $statusB -eq 0 ] do …
如果您需要知道文件是否已用完,您可以繼續測試
$statusA
並$statusB
進入循環(行內容將為空,但這與空行無法區分)。