カンマとスペースを追加するUNIXコマンド

カンマとスペースを追加するUNIXコマンド

次のファイルがあります

$ 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

-inplace.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 ""}'

これにより、最初の行を除くすべての行にコンマプレフィックスが追加されます。

関連情報