2

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

样本输入:

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 个这样的条目。

4

3 回答 3

1

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

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

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

于 2018-09-17T10:49:04.190 回答
1

请您尝试以下操作。

awk 'NF{val=(val?$0~/^ID/?val $0";":val $0:$0)} 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?$0~/^ID/?val $0";":val $0:$0) ##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.
于 2018-09-17T07:14:14.703 回答
1

您可以使用

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

输出:

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

笔记:

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

查看在线演示

于 2018-09-17T07:16:19.507 回答