使用awk / sed重新格式化长文件

时间:2017-07-26 23:54:59

标签: linux shell awk sed grep

我有一个很长的文件。该文件的内容如下:

myserver1
kernel_version
os

myserver2
kernel_version
os

myserver3
kernel_version
os
...

每个主机有超过10,000个条目和3个条目。主机名,kernel_version和操作系统版本。

我希望输出如下:

myserver1, kernel_version, os
myserver2, kernel_version, os
myserver3, kernel_version, os
...

代替。那么提供此输出的最佳awk / sed命令是什么?

4 个答案:

答案 0 :(得分:3)

使用sed:

$ sed '/^$/d;N;N;s/\n/, /g' infile                                  
myserver1, kernel_version, os                              
myserver2, kernel_version, os                              
myserver3, kernel_version, os

其工作原理如下:

/^$/d       # Delete line if empty (skips rest of commands)
N           # Append second line to pattern space
N           # Append third line to pattern space
s/\n/, /g   # Replace newlines by comma and a blank

如果你想要跳过行的标准不是“空行”而是它的行号(4,8,12 ......),你可以替换第一个命令(这是一个GNU扩展):< / p>

sed '4~4d;N;N;s/\n/, /g' infile

答案 1 :(得分:2)

您还可以使用paste

paste -d ',,\0' - - - - <file

答案 2 :(得分:1)

您可以使用:

awk 'BEGIN{RS="";OFS=", "} {print $1,$2,$3}' data.txt

将记录分隔符定义为空行,输出字段分隔符(OFS)为", "

您也可以使用:

awk 'BEGIN{RS="";OFS=", "} {$1=$1; print $0}' data.txt

$1=$1强制重组记录,请参阅this

答案 3 :(得分:0)

虽然AWK / SED可以帮助您执行此任务,但更好的方法是使用Python,假设您正在使用的* NIX系统已安装它来处理此数据。

您可以在python中使用以下内容来轻松处理:

import csv

output_file = csv.writer(open("/path/to/output/file","w"))

column_num = 3 # number of columns in your end-state data
with open("</path/to/your/input/file>","r") as input:
  row = []
  iteration_counter = 0
  for line in input:
    iteration_counter += 1
    stripped = line.strip() # to remove the newlines (\n)
    if iteration_counter <= column_num:
      row.append(stripped)
    else:
      iteration_counter = 0 # reset the counter to 0
      output_writer.writerow(row) # output the list as a csv row
      row = [] # clear the row list to nothing
      iteration_counter += 1
      row.append(stripped)