나는 최근에달리기다음 제안 솔루션을 입력하세요.
cat results.csv | tr $'\x01' \\t > result.csv
잘못된 형식의 csv 파일( \x01
유니코드를 구분 기호로 사용하는 파일)을 변환하여 파일을 수정합니다.
$'\x01'은 bash에게 정확히 무엇을 하라고 지시하나요? 이 명령은 Zsh에서는 제대로 작동하지 않는 것 같습니다.
중요한 경우 실제 목표는 다음과 같이 변환하는 것입니다.
b'flight_uid\thaving_price\tbid_price\timpressions_source_timestamp\n'b'0FY6ZsrnMy\x012270.0\x011427243278000\n0FamrXG9AW\x01710\x01747.0\x011427243733000\n 0 FY6Zsrn 내\x012000\x012270.0\x011427245266000\n0FY6ZsrnMy\x012000\x012270 . 0\x011427245088000\n0FamrXG9AW\x01330\x01747.0\x011427243407000\n0FamrXG9AW\x01710\x01747.0\x011427243981000\n0FamrXG9AW\x014 90 \x01747.0\x011427245289000\n0FamrXG9AW\x01735\x01747.0\x011427244634000\n0FamrXG9AW\x01420\x01747 . 0\x011427245595000\n0FamrXG9AW\x01470\x01747.0\x011427242443000\n0FK9yvBt9B\x011050\x011295.0\x011427242253000\n0FK9yvBt9B \x 011050\x0112%
일반 탭으로 구분된 csv 파일로 변환합니다.
Zsh를 사용하여 이 작업을 시도하면 다음과 같은 결과를 얻었지만 아무 것도 변경되지 않는 것 같습니다.
b'flight_uid\thaving_price\tbid_price\timpressions_source_timestamp\n'b'0FY6ZsrnMy\x012270.0\x011427243278000\n0FamrXG9AW\x01710\x01747.0\x011427243733000\n 0 FY6Zsrn 내\x012000\x012270.0\x011427245266000\n0FY6ZsrnMy\x012000\x012270 . 0\x011427245088000\n0FamrXG9AW\x01330\x01747.0\x011427243407000\n0FamrXG9AW\x01710\x01747.0\x011427243981000\n0FamrXG9AW\x014 90 \x01747.0\x011427245289000\n0FamrXG9AW\x01735\x01747.0\x011427244634000\n0FamrXG9AW\x01420\x01747 . 0\x011427245595000\n0FamrXG9AW\x01470\x01747.0\x011427242443000\n0FK9yvBt9B\x011050\x011295.0\x011427242253000\n0FK9yvBt9B \x 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'