我有一个很长的文件。该文件的内容如下:
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命令是什么?
答案 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)