我正在编写一个脚本,该脚本将打开文件 data.txt 并在“|”的每个 n 个实例之后添加换行符分隔符,以便每一行包含一个具有所有四个变量的观察值。基本上将一条线从宽到长分开并重塑。感谢您的帮助。
输入:
a1|b1|c1|d1|a2|b2|c2|d2|a3|b3|c3|d3|a4|b4|c4|d4
输出:
a1|b1|c1|d1|
a2|b2|c2|d2|
a3|b3|c3|d3|
a4|b4|c4|d4
答案1
你可以这样做:
perl -pe 's/(.*?\|){4}\K/\n/g'
答案2
使用 Sed:
便携:
sed -e 's/|/&\
/4;P;D' file
如果您使用 GNU Sed,则可以使用非标准\n
来表示替换模式中的换行符:
sed -e 's/|/&\n/4;P;D' file
该命令在模式空间中的s
第四个之后插入换行符。|
该P
命令打印模式空间中的第一个换行符。
该D
命令最多从模式空间中删除第一个换行符。
如果没有进行替换(|
模式空间中少于四个字符),则模式空间将不包含任何换行符 - 因此该P
命令将打印全部的模式空间,该D
命令将删除整个模式空间,然后读入文件中的下一行并重新开始循环。
答案3
tr 并粘贴,而不是您的确切输出
tr '|' '\n' <file | paste -d'|' - - - -
a1|b1|c1|d1
a2|b2|c2|d2
a3|b3|c3|d3
a4|b4|c4|d4
awk
awk -F'|' -v OFS='|' -v n=4 '{for (i=n+1; i<=NF; i+=n) $i = "\n" $i; print}' file
a1|b1|c1|d1|
a2|b2|c2|d2|
a3|b3|c3|d3|
a4|b4|c4|d4