如果列小于X,则linux合并行

ndh0cuux  于 2023-04-05  发布在  Linux
关注(0)|答案(5)|浏览(111)

我需要你在创建输出的支持。我有输出为
我在努力实现

`1  ABC  STATUS      7      PROHIBITED   8      PROHIBITED   
2  CDE  STATUS       7    PROHIBITED   8    PROHIBITED   
3  FGH  STATUS       142  PROHIBITED   
2  HIJ  STATUS       7      PROHIBITED

或者在下面的任何一个,其中每个第一列和第二列都填充在下面的空白间隙中。

`1  ABC  STATUS      
1  ABC   7      PROHIBITED   
1  ABC   8      PROHIBITED   
2  CDE  STATUS       
2  CDE   7    PROHIBITED   
2  CDE  8    PROHIBITED   
3  FGH  STATUS       
3  FGH   142  PROHIBITED   
2  HIJ  STATUS       
2  HIJ    7     PROHIBITED   
2  HIJ    8     PROHIBITED   `

到目前为止,我一直试图在一个单一的行实现这一点

cat file | paste -sd'\t\n'

但它并没有显示预期的结果。如果有人能为我提供如何实现的指导,我将不胜感激

jk9hmnmh

jk9hmnmh1#

生成第一组输出的一个awk想法:

awk '
    { if (NF==3)
         printf "%s%s",(NR>1 ? "\n" : ""),$0        # if not 1st row of input then prefix the output with "\n" (to terminate previous line of output)
      else      
         printf "%s",$0
    }
END {print ""}                                      # terminate last line of output
' file

这将产生:

flseospp

flseospp2#

使用任何POSIX awk,你都可以测试一行是否以空格开头:

$ awk '{printf "%s%s", (/^[[:space:]]/ ? "" : sep), $0; sep=ORS} END{print ""}' file
1  ABC  STATUS          7    PROHIBITED      8    PROHIBITED
2  CDE  STATUS          7    PROHIBITED      8    PROHIBITED
3  FGH  STATUS          142  PROHIBITED
2  HIJ  STATUS          7    PROHIBITED
nxagd54h

nxagd54h3#

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

sed '/^\S/{:a;x;s/\n//gp;d};H;$!d;ba' file

将记录存储在保持空间中,并在新记录的开始或文件的结束处交换回保持空间,删除所有换行符并打印。
注:新记录由行首的非空白字符指定。

nimxete2

nimxete24#

使用您所展示的示例和尝试,请尝试以下GNU awk代码。

awk -v RS='(^|\n)[0-9]+' -v OFS="\t" '
RT && FNR>1{
  gsub(/\n/,"")
  $1=$1
  print
}
END{
  if($0){
    gsub(/^ +|\n/,"")
    $1=$1
    print
  }
}
'   Input_file
ibrsph3r

ibrsph3r5#

如果要连接的行总是以空格开始,如示例输入中所示,则sed解决方案可能是

sed -e :a -e '$!N;s/\n\([[:blank:]]\)/\1/;ta' -e 'P;D' file

相关问题