2014-09-18 39 views
1

如何從特定列中刪除前導零並使用相同數量的空格刪除填充。截斷前導零和填充等於UNIX中特定字段的空格數

A001|XYZ|00001|00234|0090 
B001|XYZ|00010|00234|0990 
C001|XYZ|00321|00234|0345 
D001|XYZ|05001|00234|0777 

字段3和5是整數字段和輸出應爲如下─

A001|XYZ|1....|00234|90.. 
B001|XYZ|10...|00234|990. 
C001|XYZ|321..|00234|345. 
D001|XYZ|5001.|00234|7... 

(表示空間 '')使用awkprintf

+0

閱讀有關printf的格式化字符串。我在前一個問題中使用的概念可以通過正確的格式字符串來實現。 – 2014-09-18 17:35:12

回答

2

非常簡單:

awk ' 
BEGIN { FS = OFS = "|" } 
{ len = length ($3) 
    $3 = sprintf ("%*-d", len, $3) 
    len = length ($5) 
    $5 = sprintf ("%*-d", len, $5) 
}1' file 
A001|XYZ|1 |00234|90 
B001|XYZ|10 |00234|990 
C001|XYZ|321 |00234|345 
D001|XYZ|5001 |00234|777 

確定字段的長度。使用sprintf將該值分配給同一列。使用*可以捕獲從參數中獲取的字段長度所需的空間數量。

+1

謝謝Jaypal。這解決了我的問題 – 2014-09-18 21:35:31

0
sed ':again 
    s/^\(\([^|]*\|\)\{2\}\)0\([0-9]*\)/\1\3/
    t again 
    s/^\(\([^|]*\|\)\{4\}\)0\([0-9]*\)/\1\3/
    t again' YourFile 
更容易爲任何列

(如果需要)

sed ':again 
    s/\|0\([0-9]*\)/\1 /g 
    t again' YourFile