CSVファイルがあります
input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
"1_1_0_0_79"
"1_1_0_0_80"
"1_1_0_0_81"
"1_1_0_0_82"
"1_1_0_0_83"
"1_1_0_0_84"
"1_1_0_0_85"
.............など。
このCSVファイルを次のファイルに変換する必要があります。
result.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
1,1,0,0,79
1,1,0,0,80
1,1,0,0,81
1,1,0,0,82
1,1,0,0,83
1,1,0,0,84
1,1,0,0,85
答え1
より簡単な方法は次のとおりです。tr
$ tr '_' ',' < input.csv | tr -d '"'
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
どのように機能するかは、tr
置換する文字セットと置換という2つのパラメータを使用することです。この場合、文字コレクションは1つだけです。シェル演算子を介してinput.csv
入力tr
の標準入力ストリームをリダイレクト<
し、結果の出力をパイプしてtr -d '"'
二重引用符を削除します。
しかし、awk
それは可能です。
$ cat input.csv
"1_1_0_0_76"
"1_1_0_0_77"
"1_1_0_0_78"
$ awk '{gsub(/_/,",");gsub(/"/,"")};1' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
仕組みは少し異なります。 awkは各インラインスクリプトと同様に、各ファイルを1行ずつ読みます/Pattern match/{ codeblock}/Another pattern/{code block for this pattern}
。これにはパターンがないので、これは各行に対してコードブロックを実行することを意味します。gsub()
この関数は1行内でグローバル置換に使用されるため、アンダースコアをコンマで置き換え、二重引用符を空の文字列に置き換えます(文字を効果的に削除します)。欠落しているコードブロックのパターンマッチングの代わりに、デフォルトはその1
行のみを印刷することです。言い換えれば、コードブロックがアクションをgsub()
実行し、1
結果を印刷します。
>
出力を新しいファイルに送信するには、シェルリダイレクト()を使用します。
awk '{gsub(/_/,",");gsub(/"/,"")};1' input.csv > output.csv
答え2
あるいは、次のsed
コマンドを使用することもできます。
$ sed -e 's/_/,/g' -e 's/"//g' input.csv
1,1,0,0,76
1,1,0,0,77
1,1,0,0,78
答え3
コマンドラインテキスト処理の「スイスのチェーンチェーン」であるPerlもこれを行うことができます。構文は(偶然ではありませんが)と例にtr
非常sed
に似ています。
perl -pe 'tr/_"/,/d' input.csv > result.csv
または:
perl -pe 's/_/,/g; s/"//g' input.csv > result.csv
しかし、正直なところ、この基本的な作業のために新しいプログラミング言語を学ぶのに時間を費やしたくない場合(実際にはawk、Perl、sed、その他の類似のツールの場合)、検索をサポートするすべてのツールを使用してこれを実行できます。テキストエディタを置き換えます。
お気に入りのテキストエディタ(gedit、kate、マウスパッドなど、通常の古いメモ帳やWindowsのワードパッドなど)でCSVファイルを開きます。
メニューから検索と置換を選択します(別途検索メニューがない場合は、通常は編集にあります)。
_
検索ボックスに入力したら、,
置換ボックスに入力します。[すべて置換]をクリックします。
検索ボックスには重複
"
し、交換ボックスには何もありません。文書を保存します。
1つではなく100個または1000個のファイルでこれを行う必要がある場合は、新しいコマンドラインツールを学ぶのが合理的です。もちろん、Perl、sed、または他の言語を使用する方法を知っているので、後で同様のことをするときに多くの時間と労力を節約できます。ただし、もう一度やりたくないワンタイムタスクの場合は、テキストエディタなどの基本的な対話型ツールが最も簡単なソリューションです。
答え4
入出力区切り値のデフォルト値を変更しない理由
awk -F "_" 'BEGIN { OFS="," }; {gsub(/"/,""); print $1,$2,$3,$4,$5}' input.csv