GNU/Linux >> Linux の 問題 >  >> Ubuntu

Geditまたはコマンドラインでテキストファイルの4行ごとに変更することは可能ですか?

テキストファイルをタブ区切りのスプレッドシートに変換しようとしています。私のテキストファイルは次のようなものです:

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:

を参照してください。
  1. バックスラッシュ「\」で終わる行を次の行に追加します。

    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で検出されませんか?
Ubuntu
  1. コマンドラインでsortを使用してソートする

  2. xclipを使用してLinuxコマンドラインでコピーして貼り付けます

  3. screenieを使用したコマンドラインでのマルチタスク

  1. sedを使用してコマンドラインでテキストを操作する

  2. テキストファイルのすべての行に対してコマンドを実行する

  3. Ubuntu20.04システムのコマンドラインを使用してUbuntuにファイルをダウンロードする

  1. 複数のファイルテキストをSedに置き換えますか?

  2. Linuxのコマンドラインを使用してファイルを作成する

  3. CentOS / RHEL 7 :カーネル コマンド ラインを変更する方法