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