.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=$1
。OFS=
答え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
。