パターンが見つかるまで複数行を 1 つに連結します。

パターンが見つかるまで複数行を 1 つに連結します。

AWK モードと SED モードでは、次のようなファイルが生成されます。

|
9000
3000
1000
0000
0000
2000
1000
2000
|
5669000
518000
3000
16000
0000
28000
2241000
2841000
|
9020000
453000
520000
4000
2852000
5191000
75000
|

"|"で区切られた行をカンマで区切られた1行に合わせることはできますか?

9000,3000,1000,0000,0000,2000,1000,2000
5669000,518000,3000,16000,0000,28000,2241000,2841000
9020000,453000,520000,4000,2852000,5191000,75000

これを行うために貼り付けを使用しましたが、「|」間の行数が等しくないため、望ましくない結果が発生します。

答え1

awk解決策。疑いが少し長くなりました。

$ awk 'BEGIN{RS="|"}NF>1{print substr(gensub(/\n/,",","g"),2,length($0)-2)}' file
9000,3000,1000,0000,0000,2000,1000,2000
5669000,518000,3000,16000,0000,28000,2241000,2841000
9020000,453000,520000,4000,2852000,5191000,75000
$

オンラインでお試しください!

答え2

これはうまくいくようです:

$ tr "|\n" "\n," < input | sed 's/^,//;s/,$//'
9000,3000,1000,0000,0000,2000,1000,2000
5669000,518000,3000,16000,0000,28000,2241000,2841000
9020000,453000,520000,4000,2852000,5191000,75000

これをsをnewlineに、newlineをsに変換するtrために使用します。次に結果の出力を取得し、先行または末尾のsで削除します。|,,sed

答え3

sed ':L; ${s/\n/,/g; s/,|,/\n/g; s/|,\|,|//g};  N; bL;' file

答え4

awk -vRS='|' -vOFS=, '$1=$1""' infile
  • RS='|'awkのデフォルト値を変更しますエココードSeeratorは\nそれをパイプに変更します|
  • OFS=,awkのデフォルト値を変更します酸素出力F生産するSeeratorはコンマを空白に置き換えます,

  • $1==$1すべてのフィールドが利用可能です)は再評価を行い$0(全体行はawkとして知られています)、|RS asとOFS asに基づいてフィールドを結合します,

  • 二重引用符は、'$1=$1""'awkが文字列割り当てを実行するように強制するために使用されるため、ゼロのみの行は削除されません。

  • 出力は次のとおりです

    9000,3000,1000,0000,0000,2000,1000,2000
    5669000,518000,3000,16000,0000,28000,2241000,2841000
    9020000,453000,520000,4000,2852000,5191000,75000
    

関連情報