列nに行を作成する最後の行に改行文字を挿入する

列nに行を作成する最後の行に改行文字を挿入する

.txtファイルがあります

john,
5901,
open

lina,
2401,
open

jody,
5401,
open

各行の最後に新しい行を挿入したいと思います。結果は次のとおりです。

john,5901,open
lina,2401,open
jody,5401,open

私が何をしようとしているのか

cat file.txt | tr -d '\n'

ところで結果はこうだ。

john,5901,openlina,2401,openjody,5401,open

答え1

awkを使う短絡モード:

$ awk -vRS= -vOFS= '{$1=$1} 1' file.txt
john,5901,open
lina,2401,open
jody,5401,open

レコード区切り文字が設定されていない場合、RS=awk は空行の間のすべての内容を単一のレコードとして処理し、空の入力フィールド区切り文字のデフォルトのリストに改行を追加します。入力に他のスペースが含まれていないため、これはブロックの各行がフィールドになることを意味します。次に、フィールド値を自分自身に再割り当てしてレコードを強制的に再評価し、最後にデフォルトの単一の空白の代わりに空の出力フィールド区切り文字を使用してレコードを印刷します$1=$1OFS=

答え2

$ paste -d '\0' - - - - <file
john,5901,open
lina,2401,open
jody,5401,open

入力ファイルの各行を次の列に配置して、データを4列に再フォーマットします。セクション間の空行は 4 番目の列で、各出力行の末尾に配置されますが、空なので何も含まれません。

データにはすでにカンマが含まれているため、null区切り文字paste-d '\0')を使用してください。


この方法を使用するソリューションsedでは、データが3つの行グループに分かれているとは想定していません。

$ sed -n 'H; /^$/{x;s/\n//g;p;d;}; ${x;s/\n//g;p;}' file
john,5901,open
lina,2401,open
jody,5401,open

予約済みスペースに行を追加してこれを行いH、空の行またはファイルの終わりに遭遇すると、追加された予約済みHスペースに含まれている改行を削除して結果を印刷します。

答え3

そしてawk

awk '{ printf (NF)?$0:RS } END{ print ""}' infile

各行が空白行(タブ、スペース、改行文字セットを含む行)でない場合は、単一行にリンクされます。

このソリューションは、各グループの3つの固定回線には依存しません。

特定の場合に複数の空行があり、結果が重複しないようにするには、次のようにします。

awk 'NF{ skip=0; printf $0; next} !skip{ printf RS; skip=1 } END{ print ""}' infile

答え4

POSIXly sedを使用する1つの方法は次のとおりです。

sed -e '
    /./!d
    $ba
    N
    /\n$/!{H;s/.*//;x;D;}
    :a;s/\n//g
' input.txt

入力する:

% cat -ne input.txt
 1  $
 2  $
 3  john,$
 4  5901,$
 5  open$
 6  $
 7  $
 8  $
 9  lina,$
10  2401,$
11  open$
12  $
13  jody,$
14  5401,$
15  open$

出力:

john,5901,open
lina,2401,open
jody,5401,open

説明する:

  • sed空でない行(すべての文字、空白も可能)を見るたびに、それをパターンスペースに追加し始め、次の行を読みます。
  • パターンスペースの一番右の部分(パターンスペースで読み取られた現在の行が空白または最後の行であることを意味)の場合は、ラベルに分岐し、:aすぐにパターンスペースから改行文字を削除し、標準として印刷します。出力。
  • 読み込んだ行が完全に空でない場合は、パターンスペースに追加してから/\n$/戻り、次の行を追加します。コードの上部にあるコマンドに制御権を渡してDこれを行いますsed。しかし、それ以前は、パターン空間の最初の改行まですべてを整理します。私たちは人工物を\n配置してそれを管理しますH;s/.*//;x

関連情報