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
그것을 만드는 데 파일이 필요하지 않습니다. >>
파일이 존재하지 않으면 리디렉션을 통해 파일이 생성됩니다.
또는 대신 선을 사용할 수도 있습니다 <<<
. 예를 들어echo
grep
sample_name=$(grep -oP 'HG(\d+)(?=.g)' <<< "$file")
그러면 변수의 내용(값)이 $file
grep 명령으로 리디렉션됩니다. 어느 쪽이든 실제로는 큰 이점이 없습니다(변수에 echo
동작 변경 값(예 -n
: -e
, -E
, 또는 일부 백슬래시 이스케이프 문자(예: \n
, \t
, \0nnn
, \xHH
등))이 포함되어 있지 않는 한 bash를 참조하세요 . 그런데 요즘 이것이 권장되는 help echo
이유입니다. ), 하지만 읽기가 더 쉬울 수도 있습니다.printf
echo
답변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"