将行转换为一行

anu*_*lps 6 linux awk

您能否帮助合并输入文件中的行并按降序生成如下输出。

输入文件.txt

TerminalA/admin#
   51% used 
TerminalB/admin#
   62% used
TerminalC/admin#
   42% used
Run Code Online (Sandbox Code Playgroud)

每个终端的输出文件应包含如下一行。

TerminalB/admin# 62% used
TerminalA/admin# 51% used
TerminalC/admin# 42% used
Run Code Online (Sandbox Code Playgroud)

下面是我尝试过的代码:

awk -f process1.awk | sort -t: -k1,2rn > output.txt
Run Code Online (Sandbox Code Playgroud)

其中 awk 脚本是:

$ cat process1.awk
/^$/  { print " " }
!/^$/ { printf("%s ",$0) }
Run Code Online (Sandbox Code Playgroud)

Rav*_*h13 8

使用您显示的示例,请尝试以下awk代码。

awk '{sub(/\r$/,"")} FNR%2==0{print val OFS $0 | "sort -nrk2";next} {val=$0}' Input_file
Run Code Online (Sandbox Code Playgroud)

或者:如果您想删除%行前的额外空格,我认为应该按照所示示例删除,然后尝试以下操作:

awk '
{sub(/\r$/,"")}
FNR%2==0{
  sub(/^ +/,"")
  print val OFS $0
  next
}
{
  val=$0
}
' Input_file | sort -nrk2
Run Code Online (Sandbox Code Playgroud)

解释:

  • 检查条件FNR%2==0以查看行号是否为偶数,然后执行以下操作。
  • 打印变量 val 值,然后是OFS$0当前行)。
  • 用于 | "sort -nrk2"进一步基本上是按第二列的反向/递增顺序对输出进行排序。
  • next将跳过此处的所有进一步语句。
  • 语句{val=$0}会将当前行的值存储到变量 val 中。该语句仅在奇数行号时执行。


小智 6

作为 perl oneliner:

perl -0777 -pE 's/\n\s+/ /g' /tmp/xx2 | sort -rk2
Run Code Online (Sandbox Code Playgroud)

首先,我们告诉 Perl 读取整个文件 (slurp),而不是逐行读取。它可能无法处理不适合 RAM 的文件。然后我们使用正则表达式将换行符和空格转换为单个空格,并按第二个字段进行反向排序sort -rk2