レコードは、PIPEで区切られたファイルの次の行に移動します。

レコードは、PIPEで区切られたファイルの次の行に移動します。

次の形式のパイプで区切られたファイルがあります。

1|ABC|11|DEF|111
2|ABC|22|PQR
ST
UW|222
3|ABC|33|XYZ|333
4|ABC|44|LMN|444

2このレコードをテーブルに挿入しようとしたときから始まる行の場合、レコードのみが挿入され、開始行からレコードの挿入が開始されPQRます。4

テーブルに行2を正常に挿入するのに役立つすべての行2レコードを単一の行に入れるコマンドがある場合は、ありがとうございます。

ベストアンサー1

レコードに含まれる改行文字をスペースに置き換えるには、GNUを使用しますawk

num_fields=4
awk -v RS='([^|]*\\|){'"$num_fields"'}[^|]*\n' '
  {
   n = split(RT, a,"|"); 
   for (i=1; i<=n; ++i)
   {
      gsub("\n", " ", a[i]); 
      printf "%s%s", a[i], i==n?"\n":"|"
   }
  }' file

これは

1|ABC|11|DEF|111 
2|ABC|22|PQR ST UW|222 
3|ABC|33|XYZ|333 
4|ABC|44|LMN|444 

ここでの秘密は、awk任意のレコード区切り文字のGNUサポートを使用して1つを4つのパイプ終了フィールドと改行終了フィールドとして定義し、すべてのフィールドに埋め込まれたパイプをRS='([^|]*\\|){4}[^|]*\n'含めることを許可しないことです。 。

この仕様に準拠した実際のレコード区切り文字は、を通じてアクセスできますRTRTパイプを介して配列に分割しa、各要素に含まれている改行文字を削除しa、最後に要素を再結合してレコードを書き換えるだけの簡単な問題です。a

おすすめ記事