我有一个包含一些记录的文本文件。每条记录分为 4 行(并非总是 4 行),如示例:
----
row1
row2
row3
row4
----
row1
etc...
每行都以换行符 (LF) 结束。好的,我只需要在一行中获取记录,将 LF 字符替换为空格,例如:
---- row1 row2 row3 row4
---- row1 row2 ...etcetera
对解决方案有任何帮助或建议吗?提前致谢。
也许这可以工作?
cat FILE | xargs | sed "s/ ---- /\n---- /g"
tr "\n" " " <file | awk '{gsub(/--+/,"\n&");print}'
或全部在一个 awk 中
awk '/--/{print s;printf $0;s=""}!/--/{s=s" "$0}END{print s}' file
一个更简单的方法是
cat text_file | tr '\n' ' ' | sed 's/ ---/\n---/g'
您需要知道记录之间的分隔符到底是什么。在您的示例中,它看起来像'----',但您还说记录的数量是可变的。
无论如何,最好使用这样的代码来完成这样的事情:
cat source | (
acc=""
while read -r line; do
if test "$line" = "----" -a -n "$acc"; then
echo "$acc"
acc="$line"
else
test -n "$acc" && { acc="$acc "; }
acc="${acc}$line"
fi
done
test -n "$acc" && { echo "$acc"; }
)
为此使用 awk 而不是 shell 脚本
遍历文本文件并根据行内容执行不同的操作,这正是 awk 的设计目的。
在 21 世纪,shell 脚本应该保持简单,而其他工具应用于复杂的逻辑。
awk 'BEGIN {RS="----"; FS="\n"; OFS=" "} FNR==1 {next} {$1=RS $1; print}' input.file