【问题标题】:sed/awk/perl: find a regex, copy 5 columns of this line and paste to it at the beginning of the next linessed/awk/perl:找到一个正则表达式,复制这一行的 5 列并粘贴到下一行的开头
【发布时间】:2019-03-03 18:19:51
【问题描述】:

我有以下几行:

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

提前感谢您的帮助。

干杯, 色拉

【问题讨论】:

  • 到目前为止您尝试过什么?向我们询问具体问题,而不是您的整个代码。
  • 以数字开头的行一分为二,我可以通过使用 sed ':a $!N;s/\n[az]/ /;ta P;D' 来修复它/tmp/test1 | sed '/^$/d' 现在我正把头撞在墙上 - 不知道下一步该怎么做,这就是我决定寻求你帮助的原因。
  • 当您得到以数字开头的行时,将要复制的值保存到变量中。然后在处理不以数字开头的行时使用这些变量。

标签: bash perl awk sed text-processing


【解决方案1】:

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 变量)

【讨论】:

    【解决方案2】:

    这可能对你有用(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
    

    【讨论】:

      猜你喜欢
      • 2019-03-03
      • 1970-01-01
      • 1970-01-01
      • 2021-07-23
      • 1970-01-01
      • 2018-10-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多