如何使用上面一行中的单词填写文本文件中的空格?

时间:2012-04-11 17:48:04

标签: powershell sed grep

我有一个大型报告文件(大约20MB),如下所示:

 586  700006207        8,622.09  896 
                       9,882.82  896 
 777   68607099          900.00  896 
 587  800006207        7,059.22  896 
                         959.02  896 
                         697.87  896 
   7  280667985             .00  899 

如果值与上面的行相同,则在第1列和第2列上有空白。我需要帮助grep / sed / powershell单行填充空格,以便它看起来像这样:

 586  700006207        8,622.09  896 
 586  700006207        9,882.82  896 
 777   68607099          900.00  896 
 587  800006207        7,059.22  896 
 587  800006207          959.02  896 
 587  800006207          697.87  896 
   7  280667985             .00  899 

感谢。

3 个答案:

答案 0 :(得分:1)

这可能对您有用:

sed ':a;$!N;/^\(\( [0-9]\+ *[0-9]\+\).*\n\)\( \{15\}\)/{s//\1\2/;ta};P;D' file

根据您提供的数据,该行始终以空格开头。如果情况并非如此,那么:

sed ':a;$!N;/^\(\([0-9]\+ *[0-9]\+\).*\n\)\( \{14\}\)/{s//\1\2/;ta};P;D' file

答案 1 :(得分:1)

假设没有空白行,并且列间分隔符是空格,以下工作(在Ubuntu / bash shell中测试,使用GNU sed)...

sed -r "/^ {15}/{G; s/^ {15}(.*)\n(.{15}).*/\2\1/};h" "report"

答案 2 :(得分:1)

假设您需要保留间距,前两列是前15个字符:

awk '
    NF==2 {print fill substr($0, 16); next}
    {print; fill = substr($0, 1, 15)}
'