使用sed进行数据转换

时间:2018-02-22 22:16:39

标签: perl awk sed

我有一个类似的文件:

padding-right 25%

我希望它像

一样出现
A
B
C
D

E
F
G
H

I
J
K
L

我假设我使用A,B,C,D E,F,G,H ,但实际上我甚至不确定这是否是最好的工具。我愿意使用Linux系统上常用的任何东西。

sed中,我这样做了......它有效,但它很脏并且有一个尾随逗号。希望更简单的事情:

perl

4 个答案:

答案 0 :(得分:8)

input record separator设置为段落模式(-00),然后在剩余的任何空格上拆分每条记录:

<h1>{{ question.question_text }}</h1>

{% if error_message %}<p><strong>{{ error_message }}</strong></p>{% endif %}

<form action="{% url 'polls:vote' question.id %}" method="post">
{% csrf_token %}
{% for choice in question.choice_set.all %}
    <input type="radio" name="choice" id="choice{{ forloop.counter }}" value="{{ choice.id }}" />
    <label for="choice{{ forloop.counter }}">{{ choice.choice_text }}</label><br />
{% endfor %}
<input type="submit" value="Vote" />
<a href="{% url 'polls:index' %}">Index</a>
</form>

添加-l以启用自动换行符(但请确保它在$ perl -00 -ne 'print join("," => split), "\n"' test 之前,因为我们希望-00之前设置为$\ 的值修改):

$/

添加-a以启用自动分段模式并隐式拆分为$ perl -l -00 -ne 'print join("," => split)' test

@F

-p换出$ perl -l -00 -ane 'print join("," => @F)' test 以进行自动打印:

-n

答案 1 :(得分:3)

您可以使用

awk 'BEGIN {RS=""; FS="\n"; ORS="\n"; OFS=","} {$1=$1} 1' file

我看到gawk手册说:

  

如果RS          设置为空字符串,然后记录由空行分隔。当RS设置为空字符串时,除了FS可能具有的任何值之外,换行符始终充当字段分隔符。

因此我们实际上不需要指定FS来获得所需的输出:

awk 'BEGIN {RS=""; ORS="\n"; OFS=","} {$1=$1} 1' file

答案 2 :(得分:2)

xargs可以做到,

$ xargs -n4 < file | tr ' ' ','
A,B,C,D
E,F,G,H
I,J,K,L

答案 3 :(得分:0)

sed替换换行符有点复杂(请参阅this question)。将tr用于换行更容易。其余的可以通过sed完成。

以下命令假定yourFile不包含任何,

tr '\n' , < yourFile | sed 's/,*$/\n/;s/,,/\n/g'

tr部分会将所有换行符转换为,。结果字符串没有换行符 s/,*$/\n/删除尾随逗号并附加换行符(文本文件通常以换行符结尾) s/,,/\n/g用换行符替换,,。两个连续的逗号只出现在原始文件包含两个连续换行符的位置,即用空行分隔的部分。