2013-01-17 78 views
-4

我最近在同一論壇上提出了一個問題,並找到了解決方案。不幸的是,它必須轉換成UNIX。問題是合併來自csv文件的行。每行應以分號(;)結尾,並且如果它未將下一行組合到它中,則再次找到分號。將合併行批處理腳本轉換爲shell

爲我工作的解決方案是

@echo off 
setlocal disableDelayedExpansion 
set "ln=" 
for /f delims^=^ eol^= %%i in (myfile.txt) do (
    set "var=%%i" 
    setlocal enableDelayedExpansion 
    if "!var:~-1!"==";" (echo !var!>>temp.csv) else (<nul set /p ="!var!">>temp.csv) 
    endlocal 
) 

是否可以轉換爲UNIX腳本?

鏈接到原來的職位是:Merge line with the next line if last character is a semicolon using batch file

+3

是的,這是可能的。你有什麼嘗試? – chepner

+1

沒有「Unix腳本」這樣的東西。有腳本語言,shell,流水線實用程序和多種編程語言。做一些研究並編寫一些代碼,那麼你將能夠更好地提出良好的Stack Overflow問題。 –

回答

0

,如果你想要做文本處理接下來的時間,不要去窗口。 :d

因爲您有:

A;1;abc;<xml/>; 
;2;def;<xml 
>hello world</xml>; 
;3;ghi;<xml/>; 

您的規則是:

我需要結合線等,如果該行不結束與 分號(;)結束,將下一行組合到當前行中。

awk '!/;$/{l=l""$0;next;}{print l""$0;l=""}' file 

測試

kent$ echo "A;1;abc;<xml/>; 
;2;def;<xml 
>hello world</xml>; 
;3;ghi;<xml/>;"|awk '!/;$/{l=l""$0;next;}{print l""$0;l=""}' 
A;1;abc;<xml/>; 
;2;def;<xml>hello world</xml>; 
;3;ghi;<xml/>; 

,它工作在這種情況下也:

kent$ cat ttt 
A;1;abc;<xml/>; 
;2;def;<xml 
>h 
e 
l 
l 
o w 
o 
rld< 
/xm 
l>; 
;3;ghi;<xml/>; 

kent$ awk '!/;$/{l=l""$0;next;}{print l""$0;l=""}' ttt 
A;1;abc;<xml/>; 
;2;def;<xml>hello world</xml>; 
;3;ghi;<xml/>; 
+0

謝謝@Kent。由於CSV文件的每一行都非常大,因此我收到有關數據大小的錯誤。我發現我可能需要使用perl。是否有可能與perl使用相同的正則表達式? – Junaid

0

sed的將是我的選擇。

sed ':a;/[^;]$/{N;s/\n//;ta}' x.txt 

sed的讀取每一行,併爲每一個 設置一個標記(:1) 然後檢查是否線路缺少; (/ [^;] $ /) 如果它沒有; N讀入下一行,並用分隔它們的新行將它追加到當前行。 s/\ n //刪除換行符 ta檢查替換是否成功,如果跳轉到:a標籤再次開始檢查

+0

謝謝@peteches。由於CSV文件的每一行都非常大,因此我收到有關數據大小的錯誤。我發現我可能需要使用perl。是否有可能與perl使用相同的正則表達式? – Junaid

相關問題