テキストファイルをタブ区切りのスプレッドシートに変換しようとしています。私のテキストファイルは次のようなものです:
Dog
Cat
Fish
Lizard
Wolf
Lion
Shark
Gecko
Coyote
Puma
Eel
Iguana
GeditまたはLibreOfficeの標準の検索および置換機能を使用すると、行末をタブに簡単に置き換えることができます。ただし、キャリッジリターンをタブに交換するだけで、次のようになります。
Dog Cat Fish Lizard Wolf Lion Shark Gecko Coyote Puma Eel Iguana
しかし、私がする必要があるのは、次のようにすることです。
Dog Cat Fish Lizard
Wolf Lion Shark Gecko
Coyote Puma Eel Iguana
したがって、行末文字をすべてタブと交換できますか 4行ごとに?
GeditやLibreOfficeなどのプログラム内で正規表現を使用してそのような条件付き反復を実行できるかどうかはわかりません。したがって、これはある種のコマンドライン関数である必要がありますか?始めるのに最適なツールが何であるかさえわかりません。
更新:
次のコマンドを試しました:
sed 'N;N;N;s/\n/\t/g' file > file.tsv
paste - - - - < file > file.tsv
pr -aT -s$'\t' -4 file > file.tsv
xargs -d '\n' -n4 < inputfile.txt
しかし、結果のtsv
を開こうとすると LibreOfficeのファイルでは、列が完全に正しくありません。これが上記のコマンドを正しく実行していないことを意味するのか、それともLibreOfficeインポート機能で何か間違ったことをしているのかわかりません:
参考までに、目的の結果は次のようになります。
承認された回答:
あなたはできた sed
などのコマンドラインエディタを使用する
sed 'N;N;N;s/\n/\t/g' file > file.tsv
または、よりプログラム的に、円記号行継続文字を追加します。 GNUsedのn skip m
を使用して結合する各行に 演算子をアドレス指定し、継続行を結合するための従来のワンライナーを使用します:
sed '0~4! s/$/\t\\/' file | sed -e :a -e '/\\$/N; s/\\\n//; ta'
たとえば、Sed One-Liners Explained:
を参照してください。
バックスラッシュ「\」で終わる行を次の行に追加します。
sed -e :a -e '/\\$/N; s/\\\n//; ta'
ただし、私見では、他の標準的なテキスト処理ユーティリティの1つを使用すると簡単になります。例:
paste - - - - < file > file.tsv
(-
の数 列の数に対応します)または
pr -aT -s$'\t' -4 file > file.tsv
(-s$'\t
は省略できます 出力を複数のタブで区切ってもかまわない場合)
あなたが観察している奇妙な再インポートの振る舞いは、元のファイルがWindowsスタイルのCRLF行末を持っているためにほぼ確実です。 Windowsのファイルを操作する必要がある場合は、さまざまな方法で変換をコマンドにロールインできます。例:
tr -d '\r' < file.csv | paste - - - -
または
sed 'N;N;N;s/\r\n/\t/g' file.csv
前者はすべてのキャリッジリターンを削除しますが、後者は新しい各行の最後にCRを保持します(目的のエンドユーザーがWindowsを使用している場合はこれが必要になる場合があります)。
関連:Wacom Graphics Tablet Cth-480 / Ctl-480がUbuntu13.10で検出されませんか?