将多行合并为一个(.cap 文件)CentOS

Join multiple lines into One (.cap file) CentOS

一个条目有多行。每个条目由两个空行分隔。 每个条目必须单独一行,后跟分隔符 (;)。

示例输入:

Name:Sid
ID:123


Name:Jai
ID:234


Name:Arun
ID:12

尝试用 cat test.cap | tr -s [:space:] ';'

替换空行

输出:

Name:Sid;ID:123;Name:Jai;ID:234;Name:Arun;ID:12;

预期输出:

Name:SidID:123;Name:JaiID:234;Name:ArunID:12;

Xargs也是如此。

我也用过 sed 命令,但它只是将两行合二为一。我在一个文件中有 132 行作为一个条目和 1000 个这样的条目。

能否请您尝试以下。

awk 'NF{val=(val?[=10=]~/^ID/?val [=10=]";":val [=10=]:[=10=])} END{print val}' Input_file

输出如下。

Name:SidID:123;Name:JaiID:234;Name:ArunID:12;

说明:现在也添加上面代码的说明。

awk '                                    ##Starting awk program here.
NF{                                      ##Checking condition if a LINE is NOT NULL and having some value in it.
  val=(val?[=12=]~/^ID/?val [=12=]";":val [=12=]:[=12=]) ##Creating a variable val here whose value is concatenating its own value along with check if a line starts with string ID then add a semi colon at last else no need to add it then.
}
END{                                     ##Starting END section of awk here.
  print val                              ##Printing value of variable val here.
}
'  Input_file                            ##Mentioning Input_file name here.

您可以使用

cat file | awk  'BEGIN { FS = "\n"; RS = "\n\n"; ORS=";" } { gsub(/\n/, "", [=10=]); print }' | sed 's/;;*$//' > output.file

输出:

Name:SidID:123;Name:JaiID:234;Name:ArunID:12

备注:

  • FS = "\n" 会将字段分隔符设置为换行符`
  • RS = "\n\n" 会将您的记录分隔符设置为双换行符
  • gsub(/\n/, "", [=14=]) 将从找到的记录中删除所有换行符
  • sed 's/;;*$//' 将删除 awk
  • 添加的尾随 ;

online demo

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

sed -r '/./{N;s/\n//;H};$!d;x;s/.//;s/\n|$/;/g' file

如果不是空行,则追加以下行并去掉它们之间的换行符。将结果追加到 hold space,如果不是文件末尾,则删除当前行。在文件末尾,交换到保留 space,删除第一个字符(这将是一个换行符),然后用分号替换所有换行符(仅在最后一行附加一个额外的分号) .