私は最近走る次の提案ソリューションを入力してください。
cat results.csv | tr $'\x01' \\t > result.csv
無効な形式のcsvファイル(\x01
Unicodeを区切り文字として使用するファイル)を変換してファイルを修正します。
$'\x01'はbashに正確に何をするように指示しますか?このコマンドはZshでは正しく動作しないようです。
重要な場合、実際の目標は次のように変換することです。
b'flight_uid\thaving_price\tbid_price\timpressions_source_timestamp\n'b'0FY6ZsrnMy\x012270.0\x011427243278000\n0FamrXG9AW\x01710\x01707 Zsrn内\x012000\x012270.0\x011427245266000\n0FY6ZsrnMy\x012000\x012270 。 0\x011427245088000\n0FamrXG9AW\x01330\x01747.0\x011427243407000\n0FamrXG9AW\x01710\x01747.0\x011409 \x01747.0\x011427245289000\n0FamrXG9AW\x01735\x01747.0\x011427244634000\n0FamrXG9AW\x01420\x01747 。 0\x011427245595000\n0FamrXG9AW\x01470\x01747.0\x011427242443000\n0FK9yvBt9B\x011050\x011295.0\002 011050\x0112%
[全般]タブで区切られたcsvファイルに変換します。
Zshを使ってこれを試してみると、次のような結果が得られましたが、何も変わらないようです。
b'flight_uid\thaving_price\tbid_price\timpressions_source_timestamp\n'b'0FY6ZsrnMy\x012270.0\x011427243278000\n0FamrXG9AW\x01710\x01707 Zsrn内\x012000\x012270.0\x011427245266000\n0FY6ZsrnMy\x012000\x012270 。 0\x011427245088000\n0FamrXG9AW\x01330\x01747.0\x011427243407000\n0FamrXG9AW\x01710\x01747.0\x011409 \x01747.0\x011427245289000\n0FamrXG9AW\x01735\x01747.0\x011427244634000\n0FamrXG9AW\x01420\x01747 。 0\x011427245595000\n0FamrXG9AW\x01470\x01747.0\x011427242443000\n0FK9yvBt9B\x011050\x011295.0\002 011050\x0112%
答え1
Bashドキュメントから:
Words of the form $'string' are treated specially. The word expands to
string, with backslash-escaped characters replaced as specified by the
ANSI C standard. Backslash escape sequences, if present, are decoded
as follows:
\a alert (bell)
(...)
\nnn the eight-bit character whose value is the octal value
nnn (one to three digits)
\xHH the eight-bit character whose value is the hexadecimal
value HH (one or two hex digits)
したがって、公開された例では、$'\x01'
説明に従ってコード1を持つ文字にすぎません。私の(非常に限定的な)テストでは、zshはこれをサポートしているようです。
$ printf %s $'\x01' | od -t x1
0000000 01
0000001
ただし、tr
公開されたコマンドは、コメントが示すように、ファイルに実際にコード1のリテラル文字が含まれていると仮定する場合にのみ問題を解決します。\x01
タブ文字は文字列でなければなりません。次のフィルタはこの問題を解決する必要があります。
sed 's/\\x01/\t/g'