Bashで改行文字を別の文字に変更する

Bashで改行文字を別の文字に変更する

複数行にIDを持つ次のファイルがありますが、すべてのレコードが同じ行に存在する必要があります。

8600
22007
93509
9984
22146

到着8600,22007,93509,9984,22146

sedを使用してviでこれを実行できますが、1,$ s/\n/,/gbashを使用してそれを自動化する必要があります。

頑張ってたけどsed -i 's/\n/,/g' filename運がなかった。どんなアイデアがありますか?

答え1

単一のpasteコマンドを使用します。

paste -d, -s infile

-sコマンド印刷ラインの作成Sシリアル番号は-d,カンマで区切ります。

答え2

あなたはそれを使用することができますtr

tr '\n' ,

これは変わるでしょうすべてインスタンスが\nコンマに変更されたため、最後のインスタンスを変更する必要があります。これは例です

cat >file.txt <<x
8600
22007
93509
9984
22146
x

tr '\n' , <file.txt
8600,22007,93509,9984,22146,        # and the shell prompt follows immediately

tr '\n' , <file.txt | sed 's/,$/\n/'
8600,22007,93509,9984,22146         # line is ended with newline

この使用法は、sedすべての行が改行文字で終わると予想するPOSIXでは定義されていません。 POSIXは、最後の行に行末がない場合の末尾の改行の追加を明確に定義しているため、awk 1パイプを挿入することでこの問題を解決できます。awk

tr '\n' , <file.txt | awk 1 | sed 's/,$//'
8600,22007,93509,9984,22146         # line is ended with newline

迅速な修正のためにこれは許可されています(もちろん、paste他の場所でより良いソリューションを使用できます)。ただし、tr | awk | sedこれは見苦しい組み合わせなので、本番コードで再検討する必要があります。だから私たちは次のように終わることができます:

awk 'NR>1 {printf ","}; {printf "%s", $0}; END {printf "\n"}' file.txt

答え3

GNUを使用し、環境に変数がsedないとします。または、変数がある場合、入力長は少なくとも2行です。POSIXLY_CORRECT

sed ':a;N;$!ba;s/\n/,/g' input.txt

改行文字を置き換えることはできません。。しかし、上記のすべての行を追加すると可能です。

答え4

方法1:

perl -pe 's/\n/,/ unless eof' filename

出力

8600,22007,93509,9984,22146

方法2(Pythonを使用)

#!/usr/bin/python
m=open('file.txt','r')
j=[]
for i in m:
    j.append(i.strip())
print ",".join(j)

出力

python i.py 
8600,22007,93509,9984,22146

関連情報