2

我有一个包含一些记录的文本文件。每条记录分为 4 行(并非总是 4 行),如示例:

----
row1
row2
row3
row4
----
row1
etc...

每行都以换行符 (LF) 结束。好的,我只需要在一行中获取记录,将 LF 字符替换为空格,例如:

---- row1 row2 row3 row4
---- row1 row2 ...etcetera

对解决方案有任何帮助或建议吗?提前致谢。

4

6 回答 6

8

也许这可以工作?

cat FILE | xargs | sed "s/ ---- /\n---- /g"
于 2011-02-18T08:56:42.530 回答
5
tr  "\n" " "  <file | awk '{gsub(/--+/,"\n&");print}'

或全部在一个 awk 中

awk '/--/{print s;printf $0;s=""}!/--/{s=s" "$0}END{print s}' file
于 2011-02-18T09:57:37.660 回答
2

一个更简单的方法是

cat text_file | tr '\n' ' ' | sed 's/ ---/\n---/g'
于 2011-02-18T08:39:00.290 回答
0

您需要知道记录之间的分隔符到底是什么。在您的示例中,它看起来像'----',但您还说记录的数量是可变的。

无论如何,最好使用这样的代码来完成这样的事情:

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"; }
)
于 2011-02-18T08:32:54.057 回答
0

为此使用 awk 而不是 shell 脚本

遍历文本文件并根据行内容执行不同的操作,这正是 awk 的设计目的。

在 21 世纪,shell 脚本应该保持简单,而其他工具应用于复杂的逻辑。

于 2011-02-18T08:49:19.553 回答
0

awk 'BEGIN {RS="----"; FS="\n"; OFS=" "} FNR==1 {next} {$1=RS $1; print}' input.file

于 2011-02-18T12:20:41.493 回答