2

いくつかのレコードを含むテキスト ファイルがあります。次の例のように、各レコードは 4 つの行 (常に 4 つとは限りません) に分割されます。

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

各行は改行文字 (LF) で終了します。OK、次の例のように、LF 文字をスペースに置き換えて、1 行だけでレコードを取得する必要があります。

---- 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}'

またはすべて 1 つの 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 を使用します

テキスト ファイルを繰り返し処理し、行の内容に基づいてさまざまなことを実行することは、まさに awk が設計された目的です。

21 世紀では、シェル スクリプトをシンプルに保ち、他のツールを複雑なロジックに使用する必要があります。

于 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 に答える