テキスト処理 - 2行ごとにコンマで連結

テキスト処理 - 2行ごとにコンマで連結

私のファイルの1つに1000行を超える行があります。ファイルは次のように始まります(行番号を追加)。

Station Name
Station Code
A N DEV NAGAR
ACND
ABHAIPUR
AHA
ABOHAR
ABS
ABU ROAD
ABR

2行ごとにカンマ区切りの項目を連結してファイルに変換する必要があります。最終データは次のようにする必要があります

Station Name,Station Code
A N DEV NAGAR,ACND
ABHAIPUR,AHA
ABOHAR,ABS
ABU ROAD,ABR
...

私がしようとしているのは、シェルスクリプトを作成し、echoその間にカンマを使用することです。しかし、/にあるよりシンプルで効率的な1行ステートメントは、ここではそのsedタスクを実行できるようですawk

どんなアイデアがありますか?

答え1

cat(猫が好きなら;-))と以下を使用してくださいpaste

cat file.in | paste -d, - - > file.out

手順:paste複数のファイルから読み込み、その行を一緒に貼り付けます(最初のファイルの行1と2番目のファイルの行1など)。

paste file1 file2 ...

-ファイル名の代わりに(ダッシュ)を使用できます。pastefile1(つまり、標準入力)から最初の行を取得します。次に、file2(また標準入力)から最初の行を読み取ろうとします。ただし、stdinの最初の行を読み取って処理したので、現在入力ストリームで待機している内容は次のとおりです。第二stdinラインでは、paste幸せに最初のラインに固執します。この-dオプションは、区切り文字をタブではなくカンマに設定します。

または

cat file.in | sed "N;s/\n/,/" > file.out

PSはい、上記の内容は次のように単純化できます。

< file.in sed "N;s/\n/,/" > file.out

または

< file.in paste -d, - - > file.out

利点は使用されないことですcat

しかし、私はこの慣用語を使用したことがありません。故意に、明確さのために - あまりにも冗談ではないので、私が好きですcat(猫は良いです)。だから編集しないでください。

あるいは、「cat」の代わりに「paste」を使用する場合(「paste」はファイルを水平に結合するコマンド、「cat」はファイルを垂直に結合するコマンドです)、次のようになります。

paste file.in | paste -d, - -

答え2

誰でもここに来て、すべての行を単一のCSV行にマージしたい場合は試してみてください。

cat file | tr '\n' ','

答え3

sed 'N;s/\n/,/' file

sedを使用して2行ごとに結合(N)し、改行文字(\ n)を「、」に置き換えます。

答え4

paste -sd ',\n' file.in > file.out

また、ある文字を別の文字に置き換えるので(他のすべての改行はカンマで)、入力ファイルをその場で処理できます。

paste -sd ',\n' file.in 1<> file.in

(ただし、CRLF ターミネーター (Microsoft のターミネーターなど) を持つ非 Unix システムでは実行できない場合があり、一部のエミュレートされた POSIX はpasteUnix 以外の方法でこれを処理できます。)

関連情報