web-dev-qa-db-ja.com

同じ行に複数行の出力を印刷するにはどうすればよいですか?

同じ行に複数行の出力(単一出力)を印刷する方法はありますか?

たとえば、出力が次の場合:

abc
def
qwerty

印刷することは可能ですか:

abcdefqwerty 
13

tr -dを使用すると、指定されたセットから出現するすべての文字を削除できます。改行文字を削除するには:

tr -d '\n'

いつものように、入出力リダイレクトとパイプを使用して、ファイルや他のプロセスの読み取りまたは書き込みを行うことができます。

最後の改行を保持したい場合は、単にechoまたはprintf '\n'を使用して元に戻すことができます。 g .:

cat file1 file2... | { tr -d '\n'; echo; } > output.txt
12
David Foerster

たくさんの方法。例として、fileに例を保存しました。

$ cat file | tr -d '\n'
abcdefqwerty$ 
$ cat file | Perl -pe 's/\n//'
abcdefqwerty$ 

最後の改行文字も含めて、すべての改行文字が削除されます。あなたは代わりにしたいかもしれません:

$ printf "%s\n" "$(cat file | Perl -pe 's/\n//')"
abcdefqwerty
$ printf "%s\n" "$(cat file | tr -d '\n')"
abcdefqwerty
10
terdon

awkを介して複数行の出力をパイプできます

awk '{printf "%s",$0} END {print ""}'

またはsedを使用します。

sed ':a;N;$!ba;s/\n//g'

実行例

$ echo -e "1\n2\n3\n4" | awk '{printf "%s",$0} END {print ""}'
1234
$ echo -e "1\n2\n3\n4" | sed ':a;N;$!ba;s/\n//g'              
1234

さらに読む: AWK・serverfault.SEを使用して改行を削除する

7
dessert

また、末尾の改行を保持するyour_command | paste -sd ''

4
glenn jackman

このためにPerlを使用する場合は、chomp関数を使用できます。

Perl -pe chomp

興味のある方のために、もう少し詳しく説明します。

1つ以上のファイル名を後続の引数として渡すことができます。

Perl -pe chomp file1file2file3

場合によってはそれをしたくないかもしれません 、代わりにそのコマンドにパイプするかリダイレクトすることができます。 (これらの機能-およびその警告-すべては、他のPerl -pまたはPerl -nベースのソリューションにも適用されます。)

したがって、実行中の出力を処理する場合some-command

some-command | Perl -pe chomp

これは terdon's answer のPerlコマンドよりも潜在的に高速です。改行文字(\nで表される)は、この状況では行末にのみ表示されます。これは、各行の終了位置を決定するためにPerlが使用しているためです。 s/\n//は行全体で改行を検索しますが、chompは最後の行を削除します(最後の行に行がある場合とない場合があります)。

パフォーマンスがchompを好む主な理由ではないかもしれません。 terdon's answerPerlコマンドは、非常に長い行を持つ巨大なファイルを処理する場合を除き、わずかに遅くなります。また、速度が必要な場合は、 David Foersterの方法 のほうがおそらく高速です。ただし、Perlを使用している場合、chompはこれにぴったりのツールであり、chompの意図はs/\n//の意図よりも明確だと思います。最終的に、どちらが良いかについての客観的な答えはおそらくないでしょう。

最終改行を印刷します。

ただし、末尾の改行が確実に出力されるようにするために、コマンド置換($())の使用はお勧めしません。処理しているテキストが短い場合を除き、すべてのテキストを一度に収集してから印刷する必要があるため、コマンドが非常に遅くなる可能性が高く、コマンドが理解しにくくなります。代わりに David Foersterが提案したように を実行し、echoまたはprintf '\n'を後で実行できます。

Perl -pe chomp; echo

fromまたは(David Foersterが示すように)そのコマンドをリダイレクトfromしている場合、それを{;}で囲むことができます両方のコマンドの出力が一緒に取得されるように。端末に印刷するだけの場合は、上記のとおりに実行できます。 echo/printf '\n'は実際には入力を読み取らないため、コマンドをパイピングまたはリダイレクトしている場合でも機能します。つまり、これは機能します:

some-command | Perl -pe chomp; echo

ここでは、単に{;}を削除することはできません。

{ Perl -pe chomp; echo; } | some-other-command

または、必要に応じて、Perlに最終的な改行自体を出力させることもできます。 Perlおよびechoコマンドを{;}で囲むように、このアプローチは、パイピングまたはリダイレクトfrom(および、likeallアプローチ、これはパイプtoでも機能します):

Perl -wpe 'chomp; END { print "\n" }'

Terdonの答えのコマンドは、最終改行を印刷するこれらの方法でも正常に機能することに注意してください。例えば:

Perl -pe 's/\n//'; echo
Perl -pe 's/\n//; END { print "\n" }'
2
Eliah Kagan

シェルのみの方法を使用:

while IFS= read -r line || [ -n "$line" ]; do printf "%s"  "$line"; done < inputfile.txt
1

この回答には、作成しようとしている問題に対する解決策があります: なぜbashは$(catファイル)の\ nを削除するのですか?

cat myfile.txtと入力すると、以下が表示されます。

abc
def
ghi

ただし、echo $(cat myfile.txt)と入力すると、次のように表示されます。

abc def ghi

このメソッドは、新しい改行があった場所にスペースを挿入することに注意してください。これにより、出力が読みやすくなりますが、質問の範囲に厳密に従っていません。

1

Bashを使用している場合は、外部ツールなしで実行できます。

x=($(echo line1; echo line2))
echo "${x[@]}"

結果:

line1 line2

最初のコマンドは複数行の出力を配列に変換し、2番目のコマンドは配列を1行の複数の引数に展開します。

0
osexp2003