sed / awk / perl:找到一个正则表达式,复制该行的5列并粘贴到下一行的开头

时间:2018-09-27 19:12:33

标签: bash perl awk sed text-processing

我有以下几行:

057         -   -   No    adod3 stptazlqn    10    753
tlm    10    027        
stp    10    021                
12         -   -   No    azad1
bbcz     30    12        
03085         -   -   No    azad1 azad1222
xxaz    1    12        
azzst    1    12        
hss     2    12 

我需要做的是:

  1. 查找以数字[0-9]开头的行。
  2. 复制前5列,用空格''隔开。
  3. 将其粘贴到下一行而不是数字开头。
057         -   -   No    adod3 stptazlqn    10    753
057         -   -   No    adod3     tlm    10    027        
057         -   -   No    adod3     stp    10    021                
12         -   -   No    azad1
12         -   -   No    azad1    bbcz     30    12        
03085         -   -   No    azad1 azad1222
03085         -   -   No    azad1    xxaz    1    12        
03085         -   -   No    azad1    azzst    1    12        
03085         -   -   No    azad1    hss     2    12

谢谢您的帮助。

干杯, 色拉

2 个答案:

答案 0 :(得分:0)

awk来营救!

$ awk '{if($1+0==$1) p=$1 FS $2 FS $3 FS $4 FS $5; else $0=p FS $0}1' file | column -t

057    -  -  No  adod3  stptazlqn  10  753
057    -  -  No  adod3  tlm        10  027
057    -  -  No  adod3  stp        10  021
12     -  -  No  azad1
12     -  -  No  azad1  bbcz       30  12
03085  -  -  No  azad1  azad1222
03085  -  -  No  azad1  xxaz       1   12
03085  -  -  No  azad1  azzst      1   12
03085  -  -  No  azad1  hss        2   12

此处FS是字段分隔符,默认情况下是空白。数字测试是通过零加法完成的;用管道传输到column进行漂亮的格式化。末尾的1是打印行($0变量)的简写

答案 1 :(得分:0)

这可能对您有用(GNU sed):

sed -r '/^[0-9]/!G;s/(.*\S)\s*\n((\S+\s*){5}).*/\2 \1/;h' file

使用模式匹配从以整数开头的行中提取字段,该整数将被追加到未添加的行中。

要正确对齐列,请使用:

sed -r '/^[0-9]/!G;s/(.*\S)\s*\n((\S+\s*){5}).*/\2 \1/;h' file | column -t