複数行にIDを持つ次のファイルがありますが、すべてのレコードが同じ行に存在する必要があります。
8600
22007
93509
9984
22146
到着8600,22007,93509,9984,22146
sedを使用してviでこれを実行できますが、1,$ s/\n/,/g
bashを使用してそれを自動化する必要があります。
頑張ってたけど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