awk - カンマを改行または追加せずに列値を印刷します。

awk - カンマを改行または追加せずに列値を印刷します。

入力.txt

 EN1
 EN2
 EN3
 EN4
 EN5

出力

EN1,EN2,EN3,EN4,EN5

私はawkを試しました。しかし、カンマで印刷されません。

awk 'BEGIN { OFS = ","} { printf $1}' input.txt

GNU Awkバージョン4.0.0があります。

答え1

awk 'BEGIN{ORS=","}1' input.txt

次を生成します。

EN1,EN2,EN3,EN4,EN5,

だからはいカンマで印刷します(したがって、これが起こらないという記事のコメントを理解したかどうかわかりません)。しかし、末尾のコンマが問題のようです。

GNU Awk 3.1.7でテストされました。

答え2

私も古い話題を知っていますが、拒否できませんでした。ここに別の短くて簡単な方法があります。

$ paste -sd, input.txt
EN1,EN2,EN3,EN4,EN5
$

LinuxとSolarisはもちろん、他のプラットフォームでも動作します。

答え3

trこの場合に使用できます。

tr '\n' ',' <input.txt

また、最後の改行文字をカンマで置き換えます。これを防ぐために、Linuxで入力ファイルが改行で終わることを知っている場合:

<input.txt head -c -1 | tr '\n' ,

; echo出力を改行文字で終了するには、追加します。

あるいは、シェルに末尾のカンマ(存在する場合)を削除させることもできます。

columns=$(<input.txt tr '\n' ',')
echo "${columns%,}"

答え4

行末にカンマを印刷しない方法:

{printf("%s", NR == 1 ? $0 : ","$0);} END {printf("\n");} file

説明する

最初の行(NR == 1)が表示されたら、印刷してください。それ以外の場合は、カンマと行が引数として送信されますprintf

このソリューションでは、次の三項AWK演算子を使用します。?:

NR == 1 ? $0 : ","$0

NR変数が等しい場合は1最初の行を引数として送信しprintf、そうでない場合は現在の行に関連付けられているコンマを送信します。

関連情報