Input.txtがあります
1
2
3
4
5
私はそのようなoutput.txtを取得する必要があります
1,2,3,4,5
どうやってするの?
これを試して:
tr '\n' ',' < input.txt > output.txt
sed
では、次を使用できます。
sed -e 'H;${x;s/\n/,/g;s/^,//;p;};d'
H
は、パターンスペースをホールドスペースに追加します(ホールドスペースに現在の行を保存します)。 ${...}
は、最後の行にのみ適用されるアクションを囲みます。これらのアクションは次のとおりです。x
スワップホールドとパターンスペース。 s/\n/,/g
埋め込まれた改行をコンマに置き換えます。 s/^,//
先頭のコンマを削除します(ホールドスペースの先頭に改行があります)。およびp
印刷。 d
はパターンスペースを削除します-印刷しません。
したがって、以下を使用することもできます。
sed -n -e 'H;${x;s/\n/,/g;s/^,//;p;}'
-n
はデフォルトの印刷を抑制するため、最後のd
は不要になります。
このソリューションでは、CRLF行末がローカルネイティブ行末である(したがって、DOSで作業している)ため、sed
が印刷操作でローカルネイティブ行末を生成すると想定しています。 DOS形式の入力はあるが、Unix形式(LFのみ)の出力が必要な場合は、少し努力する必要がありますが、質問で明示的に指定する必要もあります。
MacOS X 10.6.5では、1..5、1..50、1..5000の数字(1行の出力で23,893文字)で問題なく動作しました。私はそれよりももっと強くプッシュしたいかどうかはわかりません。
@eumiroの回答に対する@Jonathanのコメントへの応答:
tr -s '\r\n' ',' < input.txt | sed -e 's/,$/\n/' > output.txt
使用されるtr
とsed
は非常に優れていますが、ファイルの解析と正規表現に関しては、Perlに勝るものはありません(なぜsedとtrがPerlよりもShellに近いと考えるのかはわかりません。 )
Perl -pe 's/\n/$1,/' your_file
純粋なシェルでそれを実行したい場合は、文字列の一致を見てください
${string/#substring/replacement}
貼り付けコマンドを使用します。パイプを使用しています:
echo "1\n2\n3\n4\n5" | paste -s -d, /dev/stdin
ファイルを使用しています:
echo "1\n2\n3\n4\n5" > /tmp/input.txt
paste -s -d, /tmp/input.txt
Manページごとに、sはすべての行を連結し、dは区切り文字を定義できます。
cat input.txt | sed -e 's|$|,|' | xargs -i echo "{}"
pythonバージョン:
python -c 'import sys; print(",".join(sys.stdin.read().splitlines()))'
末尾のコンマの問題はありません(join
はそのように機能するため)、splitlines
はネイティブの行末でデータを分割します(そしてそれらを削除します)。