次のファイルがあります
$ cat IP
10.3.1.1
10.4.1.1
10.6.3.1
10.19.4.2
10.22.3.4
どうすれば次のように作成できますか?
$ cat IP
10.3.1.1, 10.4.1.1, 10.6.3.1, 10.19.4.2, 10.22.3.4
答え1
そしてperl
:
perl -pe 's/\n/, / unless eof' IP
-i
nplace.txtファイルを編集するオプションが追加されましたi
。または-i.orig
所定の位置で編集するが、元のコンテンツをIP.orig
。
シェルでは、zsh
次のようにこれらのIPをアレイにロードすることもできます。
ips=( ${(f)"$(<IP)"} )
その後、j
カンマで書き直します。
print -r -- ${(j[, ])ips} > IP
一度に1行ずつ処理するPerlとは異なり、Perlはファイル全体をメモリにロードします。
他の2つの違い:
- 空行は捨てられます。
- 元のファイルに空のファイルがない場合、または最後の行が適切に区切られていないファイルがある場合でも、改行文字は常に最後に追加されます。
答え2
GNUを介して実装sed
:
sed -z 's/\n*$//;s/\n/, /g;s/$/\n/' IP
答え3
おそらく
perl -e 'print join(", ", map { chomp; $_ } <>), "\n"' IP
または
awk '{ printf "%s%s", c, $0; c = ", " } END { print "" }' IP
または、高速で汚れたハッキングを実行し、ファイルの行数(おそらく8000のみ)に制限し、これがxargs
実際にこれのために設計されていないことを覚えておいてください
xargs <IP | sed 's/ /, /g'
これらはすべてサンプルデータセットから同じ出力を生成します。
10.3.1.1, 10.4.1.1, 10.6.3.1, 10.19.4.2, 10.22.3.4
その後、その出力を一時ファイルにリダイレクトし、元のファイルを上書きできます。ここでcommand_from_above
変更を作成するために選択したコマンドに置き換えます(この回答または他の人はここにあります)。標準出力元のファイルの代わりに:
command_from_above >"IP.$$.tmp" && mv -f -- "IP.$$.tmp" IP
rm -f -- "IP.$$.tmp"
答え4
awkを使用してください:
awk '{printf "%s%s", (NR==1) ? "" : ", ", $0}END{print ""}'
これにより、最初の行を除くすべての行にコンマプレフィックスが追加されます。