두 개의 열 파일에 두 개의 변수(탭으로 구분) 쓰기

두 개의 열 파일에 두 개의 변수(탭으로 구분) 쓰기

GNU/Linux를 처음 접하는 여러분 안녕하세요.

탭으로 구분된 2열 파일에 두 개의 변수를 작성하고 싶습니다. 내 코드에서 변수는 $sample_name및 입니다 $file.

나는 다음 명령을 사용합니다.

  • touch파일을 생성하고
  • echo -e $sample_name $file | column -t >> $output_file각 줄을 작성하십시오. 이렇게 하면 파일 목록이 생성됩니다.

어떤 아이디어가 있나요?

단순화된 스크립트:

touch $output_file
for file in $path/*.g.vcf; do
        sample_name=`echo $file | grep -P 'HG(\d+)(?=.g)' -o`
        echo -e $sample_name $file | column -t >> $output_file
done

예상 출력(출력 파일 보기):

HG00321        ./.../HG00321/HG00321.g.vcf
HG00322        ./.../HG00322/HG00322.g.vcf
# and so on

답변1

사용할 필요는 없습니다 column -t. 실제로 이렇게 하면 탭이 공백으로 확장되어 너비에 관계없이 열이 올바르게 정렬됩니다. . 을 사용 printf하고 변수를 큰따옴표로 묶는 것을 기억하세요. 예를 들어

for file in "$path/"*.g.vcf; do
  sample_name=$(echo "$file" | grep -P 'HG(\d+)(?=.g)' -o)
  printf "%s\t%s\n" "$sample_name" "$file" >> "$output_file"
done

그건 그렇고, touch그것을 만드는 데 파일이 필요하지 않습니다. >>파일이 존재하지 않으면 리디렉션을 통해 파일이 생성됩니다.

또는 대신 선을 사용할 수도 있습니다 <<<. 예를 들어echogrep

  sample_name=$(grep -oP 'HG(\d+)(?=.g)' <<< "$file")

그러면 변수의 내용(값)이 $filegrep 명령으로 리디렉션됩니다. 어느 쪽이든 실제로는 큰 이점이 없습니다(변수에 echo동작 변경 값(예 -n: -e, -E, 또는 일부 백슬래시 이스케이프 문자(예: \n, \t, \0nnn, \xHH등))이 포함되어 있지 않는 한 bash를 참조하세요 . 그런데 요즘 이것이 권장되는 help echo이유입니다. ), 하지만 읽기가 더 쉬울 수도 있습니다.printfecho

답변2

당신이하고 싶은 일은 다음과 같습니다

for pathname in "$dirpath"/*.g.vcf; do
    printf '%s\t%s\n' "$(basename "$pathname" .g.vcf)" "$pathname"
done >"$output_file"

그러면 와일드카드 패턴과 일치하는 경로 이름이 반복됩니다. 각 경로 이름에 대해 를 사용하여 basename(알려진 파일 이름 접미사를 제거할 수도 있음) 경로 이름의 파일 이름 부분을 추출 .g.vcf하고 전체 경로 이름과 함께 인쇄합니다.

루프의 출력은 출력 파일로 리디렉션되며, 출력 파일이 아직 없으면 셸이 생성하고, 있으면 잘라냅니다(비웁니다).

사용하신 변수 이름이 path쉘에 있는 같은 이름의 특수(배열) 변수와 충돌해서 이름을 바꿨습니다 zsh. 또한 가능한 모든 파일 이름을 처리할 수 있도록 모든 확장자 주위에 큰따옴표를 추가했습니다. 확장명을 인용하지 않은 경우 파일 이름에 공백이나 와일드카드 문자가 포함되어 있으면 문제가 발생합니다.

또한보십시오:


이 유틸리티를 사용하지 않고 basename경로 이름의 원치 않는 부분을 잘라내려면 매개변수 대체를 사용하십시오 . 이 코드는 외부 유틸리티를 사용하지 않습니다.

for pathname in "$dirpath"/*.g.vcf; do
    name=${pathname##*/}
    printf '%s\t%s\n' "${name%.g.vcf}" "$pathname"
done >"$output_file"

관련 정보