合并 Linux 行,如果列少于 X。

huangapple go评论100阅读模式
英文:

linux merge rows if Columns less than X

问题

I need you support in creating the output.
我需要你的支持来创建输出。

I have output as
我的输出如下

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

I am trying to achieve as
我试图实现以下结果

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

OR Either below where every first and second column is filled in below empty gaps.

或者下面的方式,其中每个第一列和第二列都填在下面的空白处。

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

so far I have tried to achieve this in one single row with
到目前为止,我已经尝试在一行中实现这个结果

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

but it is not showing the result as expected. it would be appreciated if any one can provide me with guidance as to how to achieve
但它没有显示预期的结果。如果有人可以提供关于如何实现的指导,将不胜感激。

英文:

I need you support in creating the output.
I have output as

  1. 1 ABC STATUS
  2. 7 PROHIBITED
  3. 8 PROHIBITED
  4. 2 CDE STATUS
  5. 7 PROHIBITED
  6. 8 PROHIBITED
  7. 3 FGH STATUS
  8. 142 PROHIBITED
  9. 2 HIJ STATUS
  10. 7 PROHIBITED

I am trying to achieve as

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

OR Either below where every first and second column is filled in below empty gaps.

  1. `1 ABC STATUS
  2. 1 ABC 7 PROHIBITED
  3. 1 ABC 8 PROHIBITED
  4. 2 CDE STATUS
  5. 2 CDE 7 PROHIBITED
  6. 2 CDE 8 PROHIBITED
  7. 3 FGH STATUS
  8. 3 FGH 142 PROHIBITED
  9. 2 HIJ STATUS
  10. 2 HIJ 7 PROHIBITED
  11. 2 HIJ 8 PROHIBITED `

so far I have tried to achieve this in one single row with

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

but it is not showing the result as expected. it would be appreciated if any one can provide me with guidance as to how to achieve

答案1

得分: 2

以下是代码的翻译部分:

  1. { if (NF==3)
  2. printf "%s%s",(NR>1 ? "\n" : ""),$0 # 如果不是输入的第一行,则在输出前加上"\n"(用于终止先前的输出行)
  3. else
  4. printf "%s",$0
  5. }
  6. END {print ""} # 终止最后一行的输出
  7. ' file

这段代码的功能是生成以下输出:

  1. 1 ABC STATUS 7 PROHIBITED 8 PROHIBITED
  2. 2 CDE STATUS 7 PROHIBITED 8 PROHIBITED
  3. 3 FGH STATUS 142 PROHIBITED
  4. 2 HIJ STATUS 7 PROHIBITED 8 PROHIBITED
英文:

One awk idea for generating the first set of output:

  1. awk '
  2. { if (NF==3)
  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)
  4. else
  5. printf "%s",$0
  6. }
  7. END {print ""} # terminate last line of output
  8. ' file

This generates:

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

答案2

得分: 2

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

  1. 1 ABC STATUS 7 PROHIBITED 8 PROHIBITED
  2. 2 CDE STATUS 7 PROHIBITED 8 PROHIBITED
  3. 3 FGH STATUS 142 PROHIBITED
  4. 2 HIJ STATUS 7 PROHIBITED
英文:

Using any POSIX awk you can just test if a line starts with a space or not:

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

答案3

得分: 2

以下是已翻译的代码部分:

  1. awk -v RS='(^|\n)[0-9]+' -v OFS="\t" '
  2. RT && FNR>1{
  3. gsub(/\n/,"")
  4. $1=$1
  5. print
  6. }
  7. END{
  8. if($0){
  9. gsub(/^ +|\n/,"")
  10. $1=$1
  11. print
  12. }
  13. }
  14. ' Input_file
英文:

With your shown samples and attempts please try following GNU awk code.

  1. awk -v RS='(^|\n)[0-9]+' -v OFS="\t" '
  2. RT && FNR>1{
  3. gsub(/\n/,"")
  4. $1=$1
  5. print
  6. }
  7. END{
  8. if($0){
  9. gsub(/^ +|\n/,"")
  10. $1=$1
  11. print
  12. }
  13. }
  14. ' Input_file

答案4

得分: 1

如果要合并的行始终以空格开头,如示例输入中所示,那么可以使用 sed 解决方案:

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

If lines to be joined always begin with blanks as in the sample input, then a sed solution could be

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

答案5

得分: 1

这可能适用于你(GNU sed):

  1. sed '/^\S/{:a;x;s/\n//gp;d};H;$!d;ba' 文件名

将记录存储在保持空间,并在新记录的开始或文件末尾时,切换回保持空间,移除任何换行符并打印。

注:新记录以行首的非空白字符为标志。

英文:

This might work for you (GNU sed):

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

Store records in the hold space and at the start of a new record or the end of the file, swap back to the hold space, remove any newlines and print.

N.B. A new record is designated by a non-white space character at the start of a line.

huangapple
  • 本文由 发表于 2023年4月4日 03:39:33
  • 转载请务必保留本文链接:https://go.coder-hub.com/75923200.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定