私のファイルの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 ...
-
ファイル名の代わりに(ダッシュ)を使用できます。paste
file1(つまり、標準入力)から最初の行を取得します。次に、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 はpaste
Unix 以外の方法でこれを処理できます。)