2014-09-18 35 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