web-dev-qa-db-ja.com

テキストファイルのすべての行を1行に結合するにはどうすればよいですか?

テキストのすべての行を1行にしたい。私はコーディングをすることで学ぶことを試みる初心者です。この問題を解決するために4時間を費やしました。この問題には簡単な解決策があることは知っています。これが私がやってきたことです。

 sed -e 'N; s/\ n //' myfile.txt #Does nothing 
 
 sed -e:a -e N -e 's/\ n// '-e ta myfile.txt #output all messed up and not the head or tail of the syntax 
 
 cat myfile.txt | tr -d '\ n'> myfile.txt#すべての行を削除します

テキストファイルは次のとおりです。

 500212 
 262578-4-4 
 23200 
 GRIFFITH LABORATORIES LTD 
 GRIFFITH LABORATORIES 
南ダブリン郡議会
 OFFICE 
 OFFICE(INDUSTRIAL)
 Rateable 
 2 Pineview Industrial Estate 
 Firhouse Road 
 Knocklyon 
 2007年12月31日
 2008年1月1日」

どこが間違っているのかわかりません。

28
John

tr使用したとおりshould動作し、最も簡単です-必要なことは別のファイルへの出力 。入力ファイルを出力として使用すると、観察したとおり、結果は空のファイルになります。

cat myfile.txt | tr -d '\ n'> oneline.txt

一部のエディターは、行を\r\nで終了することを覚えておく必要があります。その場合、使用

cat myfile | tr -d '\r\n'
30
ish

ここにあります。それは別の解決策であり、シンプルで簡単です。

echo $(cat Input.txt) > Output.txt
8
αғsнιη

単純な方法

Awkを使用する別の方法、

cat myfile.txt | awk '{print}' ORS=''

出力:

500212262578-4-423200GRIFFITH LABORATORIES LTDGRIFFITH LABORATORIESSOUTH DUBLIN COUNTY COUNCILOFFICEOFFICE(INDUSTRIAL)List Rateable2 Pineview Industrial EstateFirhouse RoadKnocklyon31 Dec 200701 Jan 2008 "

注:

ORS = ''->これはフィールド区切り記号です。フィールド区切り記号として、単一引用符の間に任意の文字を含めることができます。このawkメソッドを使用すると、スペースとすべての文字を含めることができます。

これが役立つことを願っています!

3
M.S.Arun

ラベル:aをメイン命令の外に配置する必要はありません。また、-eオプションも必要ありません。最後に、/$/は不要です(すべての行にEOL文字があります)。

他の答えを改善すると、

sed -i ':a; N; s/\n/ /; ta' file

次のように書けばより明確になります。

sed -i ':a
        N
        s/\n/ /
        ta' file

コマンドは次のように機能します。

  1. Nは、次の行を(複数行の)パターンスペースに追加します。これには、現在の行が既に含まれています。
  2. s/\n/ /は、Nによって生成された改行文字\nをスペースに置き換えます。
  3. taは、ラベル:aに続くスクリプト行に移動しますステップ2の置換が成功した限りie置換が発生した場合、実行はスクリプトの終わりを「ヒット」せずにステップ1にジャンプしますiewithout入力の別の行を読み取ります。

次のことに注意してください。

  • sedは、入力ファイルの行を1つずつ順番に読み取ります。1行目から;
  • :aは単なるラベルであり、実行されるコマンドではありません。
  • Nは、原則として、任意の行で実行されますが、
  • s/\n/ /(原則として任意の行で実行)は成功最後の行以外の行で
  • taはスクリプトの終わりを到達可能にします入力の最後の行が読み取られた場合のみsが失敗する唯一の行)
  • 最後の1が読み込まれない限り、1番目の1が読み込まれた後、それ以上の入力行はパターンスペースに読み込まれませんが、読み込む行がもうありません、および暗黙のpコマンドが実行されます。

したがって、スクリプトは基本的に入力の1行目を読み取り、改行をスペースで置き換えるたびに次の行を1つずつ追加し続けます。 最後の行が追加された後(およびスペースで\nが変更された)、Nは行を追加できず、sは失敗し、taスキップされ、スクリプトの最後に到達し、暗黙のprintステートメントが現在の1行のパターンスペースで実行されます。

-iオプションは、入力ファイルfileを1行のパターンスペース全体に置き換えます。

これを行う最も簡単な方法は次のとおりです。

paste -s -d:" " test.txt

http://ss64.com/bash/paste.html

2
JConstenla

GEDIT:

\nを検索してスペース ''に置き換えます。
「検索」->「置換」を選択すると、置換ウィンドウを表示できます
またはkeybpardショートカット経由 Ctrl+H

以下のスクリーンショットをご覧ください。

元のテキストは1〜14行目にあります。
結果は16行目にあります。

enter image description here

2
Parto

これを試して

sed -e :a -e '/$/N; s/\n/\\n/; ta' [filename]

http://anandsekar.github.io/joining-all-lines-in-a-file-using-sed/

1
Anand Rajasekar

Pythonのアプローチ:

python -c "import sys; print(' '.join([ l.strip() for l in sys.stdin.readlines() ]))" < input.txt

AWK:

awk '{printf "%s ",$0}' /etc/passwd  
0
vim <your_file>

Vim内に入力してEnterを押します。

:% s/\n/ /g
0
Anatoly

純粋なbashソリューション:

while read i; do printf '%s ' "$i"; done < file.txt > outfile.txt
0
evilsoup

Yourfile.txtの出力を目的の結果であるnewfile.txtにリダイレクトするようにsedに指示する必要があることを単に忘れていたと思います。これは必要なコマンドのように見えますが、マージしようとしているファイルがsedのバッファーに対して大きすぎない場合にのみ:sed -e :a -e N -e 's/\n/ /' -e ta yourfile.txt >newfile.txt別のフォーラム に感謝します。ここでは、sedの機能について説明しています。コマンドをテストしましたが、うまくいきました。

0
user76204

それが私だったら、vimでそれを開いて押します Shift+J 何回か。

0
thomasrutter