2016-07-28 72 views
3

this question開始,我找到split實用程序,它接收一個文件並將其分成均勻大小的塊。默認情況下,它會將這些塊輸出到新文件中,但我想要將它們輸出到標準輸出中,並用換行符(或任意分隔符)分隔。這可能嗎?將`split'工具的輸出發送到標準輸出

我試圖cat testfile.txt | split -b 128 - /dev/stdout

其失敗,出現錯誤split: /dev/stdoutaa: Permission denied

看看幫助文本,看起來這告訴split使用/ dev/stdout作爲前綴作爲文件名,而不是寫入/ dev/stdout本身。它並不指示任何選項直接寫入帶有分隔符的單個文件。有沒有一種方法可以讓split這樣做,還是有一種不同的工具可以完成我想要的行爲?

+0

http://stackoverflow.com/a/38630451/2836621 –

+1

'貓文件| split' - >' Kaz

回答

5

目前尚不清楚正是你想做的事,但也許是--filter選項split將助陣:

--filter=COMMAND 
      write to shell COMMAND; file name is $FILE 

也許你可以直接使用。例如,這一次將讀取的文件10個字節,使每個塊通過tr命令:

split -b 10 --filter "tr [:lower:] [:upper:]" afile 

如果你真的想發出對流stdout中該塊之間有分隔符,你可以這樣做是這樣的:

split -b 10 --filter 'dd 2> /dev/null; echo ---sep---' afile 

如果afile是我當前目錄中的文件,看起來像:

the quick brown fox jumped over the lazy dog. 

然後上面的命令將導致:

the quick ---sep--- 
brown fox ---sep--- 
jumped ove---sep--- 
r the lazy---sep--- 
dog. 
---sep--- 
+0

最後一個例子就是我所要做的行爲。雖然這有效,但我最終發現,通常情況下允許分割生成新文件,然後循環遍歷它們,然後刪除它們。 – ecapstone

0

不,該實用程序不會寫任何標準輸出。它的standard specification特別說沒有使用的標準輸出。

如果您使用split,則需要連接創建的文件,在它們之間插入一個分隔符。

如果你只是想插入分隔符每ň條線,你可以使用GNU sed

$ sed '0~3a\-----\' file 

此插入含有-----每3號線的線路。

1

從信息頁面: `--filter = COMMAND」 使用此選項,而不是簡單地寫入到每個輸出文件, 寫入通過管道到指定的shell命令每個 輸出文件。 COMMAND應使用$ FILE環境變量 ,該變量被設置爲命令的每個調用 的不同輸出文件名。

split -b 128 --filter='cat ; echo ' inputfile 
1

這是做到這一點的一種方法。你將得到每個128個字符變量「var」。

您可以使用您的首選分隔符來打印或使用它進行進一步處理。

#!/bin/bash 

cat yourTextFile | while read -r -n 128 var ; do 
    printf "\n$var" 
done 

你可以在命令行下面使用它:

while read -r -n 128 var ; do printf "\n$var" ; done < yourTextFile 
+1

您可以刪除'cat'並在'done'後面加上' Kusalananda

+0

謝謝,更新。 –