-t\t를 사용하여 참여하는 것이 실수입니까?

-t\t를 사용하여 참여하는 것이 실수입니까?

내 명령에 문제가 있습니다 join. "기본 조인 필드는 먼저 공백으로 구분됩니다"(에서 인용 join --help). 그러나 탭으로 구분된 파일에는 문장이 포함된 필드가 있습니다. 따라서 다음을 사용하여 이 두 파일을 연결하고 싶습니다 -t\t(Cygwin에서는 오류 보고를 시도했지만 -t "\t"CentOS에서는 시도하지 않았습니다). 예기치 않게 명령은 이러한 필드를 두 개의 연속 라인에 출력합니다. dos2unix및 가 있는 두 파일을 모두 처리 했습니다 sort.

샘플 출력은 다음과 같습니다. 1행과 3행은 file1에서 가져온 것이고, 2행과 4행은 file2에서 가져온 것입니다. 첫 번째 줄과 두 번째 줄은 같은 줄에 나타나야 합니다. 그러나 -t\t사용하는 경우에는 두 개의 연속된 줄에 표시됩니다(아래 참조). 그렇지 않은 경우에는 -t같은 줄에 표시됩니다.

LM00089 0.6281  0       Q27888  L-lactate dehydrogenase
LM00089 gi|2497622|sp|Q27888|LDH_CAEEL  0.6281  0.422
LM00136 0.3219  0.376741        O62619  Pyruvate kinase
LM00136 gi|27923979|sp|O62619|KPYK_DROME        0.3219  0.111

이게 실수인지 아니면 제가 뭔가 실수를 한 것인지 궁금합니다.

답변1

-t \t구분 기호로 전달됨 t: 따옴표가 없는 백슬래시는 항상 문자 그대로 다음 문자를 가져옵니다(다음 문자가 개행 문자가 아닌 경우). 구분 기호로 -t "\t"전달되면 여러 문자를 전달할 때 다양한 버전이 다르게 동작할 수 있습니다.\tjoin

Bash에서 탭을 전달하려면 를 사용합니다 -t $'\t'. 이 $'…'구문은 C 및 기타 여러 언어의 기능을 모방합니다. 여기서 \제어 문자가 뒤에 오는 문자는 제어 문자를 나타내고 그 \뒤에 8진수가 올 수 있습니다.

또 다른 방법은 스크립트에 텍스트 탭 문자(작은따옴표 또는 큰따옴표 사이)를 넣는 것입니다. 이것은 읽기가 쉽지 않습니다.

예를 들어 모든 POSIX 셸에 대한 이식성이 필요한 경우 다음 dash을 사용하세요.

tab=$(printf '\t')
join -t "$tab" …

아니면 직접 join -t "$(printf '\t')" ….

관련 정보