내 명령에 문제가 있습니다 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"
전달되면 여러 문자를 전달할 때 다양한 버전이 다르게 동작할 수 있습니다.\t
join
Bash에서 탭을 전달하려면 를 사용합니다 -t $'\t'
. 이 $'…'
구문은 C 및 기타 여러 언어의 기능을 모방합니다. 여기서 \
제어 문자가 뒤에 오는 문자는 제어 문자를 나타내고 그 \
뒤에 8진수가 올 수 있습니다.
또 다른 방법은 스크립트에 텍스트 탭 문자(작은따옴표 또는 큰따옴표 사이)를 넣는 것입니다. 이것은 읽기가 쉽지 않습니다.
예를 들어 모든 POSIX 셸에 대한 이식성이 필요한 경우 다음 dash
을 사용하세요.
tab=$(printf '\t')
join -t "$tab" …
아니면 직접 join -t "$(printf '\t')" …
.