2015-01-07 40 views
3

使用可用於慶典的工具,我怎麼轉換分隔的數據轉換分隔的文件,以固定寬度的Linux

foo|bbbaaarrr|bazz 

到固定寬度的數據

foo  bbbaaarrrbazz  EOL 

我嘗試使用列作爲文檔暗示我可以定義列寬,不起作用。 我敢肯定,這是使用sed或awk的微不足道,但我不熟悉它們。

+0

向我們展示一些示例輸入和所需的輸出。 –

+1

1)列的寬度是否相同? 2)如果一個值超出列寬,你期望什麼? – rici

+0

輸入列將是不同的寬度,我強制輸出是相同的寬度。我的期望是,它應該會非常壯觀,因爲輸入數據是嚴格定義的(這就是爲什麼我不知道爲什麼他們堅持用這種格式來交換這些數據) –

回答

10

以下應爲你工作:

column -t -s '|' input_file_here 

它將輸入文件轉換爲表格格式。輸入記錄分隔符由-s指定。如果要在字段中填充空格以外的內容,請使用-o來設置輸出分隔符。輸出分隔符默認爲兩個空格,所以輸出中每列之間會有兩個空格。

實施例:

$ cat input 
hello|world|testing 
a|b|c 
another|test|line 

$ column -t -s '|' input 
hello world testing 
a  b  c 
another test line 

http://man7.org/linux/man-pages/man1/column.1.html


編輯:

如果需要每個字段是固定長度,則可以使用awk爲該。你需要設置輸入分隔符爲您的文件,但這樣的事情應該工作:

$ awk -F '|' '{ for (i=1; i<=NF; i++) { printf("%-10s", $i); } print ""; }' input 
hello  world  testing 
a   b   c 
another test  line 

只要改變在printf語句中指定的字段寬度。

+0

這就是我認爲的,使用-c來定義列寬度。沒有工作,其他手冊頁意味着-c定義了列數。我認爲專欄只是一種類型的預報。在你的例子中,列的寬度由最長參數的寬度來定義。 –

+1

@RickDeBay - 查看編輯。如果您需要將字段截斷爲擬合,您還需要使用'substr($ i,1,your_len_here)'而不是'$ i'。 –

+1

一個小小的改進(假設需要截斷):將寬度作爲參數傳遞:'awk -F'|' -v w = 9'{for(i = 1; i <= NF; i ++)printf「% - * s」,w,substr($ i,1,w);打印「」}'文件' –

相關問題