파일 이름 목록을 텍스트 파일로 인쇄하려고 하는데 특정 파일 이름을 같은 줄에 인쇄해야 합니다. 예를 들어 4개의 파일이 있습니다.
Paleo_R1.fastq
Paleo_R2.fastq
Vegan_R1.fastq
Vegan_R2.fastq
내가 원하는 출력은
Paleo_R1.fastq Paleo_R2.fastq
Vegan_R1.fastq Vegan_R2.fastq
ls 함수를 사용하여 텍스트 파일로 직접 출력할 수 있다는 것을 알고 있지만 ls >> file.txt
특정 입력 줄 항목을 특정 출력 줄에 인쇄하는 옵션은 없습니다.
또한 다음과 같은 for 루프를 사용할 수 있다는 것을 알고 있습니다 >
for file in Vegan*R1*.fastq;
do echo $file ${file%_R1.fastq}_R2.fastq >> file.txt;
done
하지만 각 파일 이름에 대해 별도의 명령을 사용하고 싶지 않습니다. 채식주의자 및 팔레오 다이어트에 적합합니다.
특정 라인을 특정 출력 라인으로 인쇄하는 방법이 있습니까(입력 라인 1과 2를 출력 라인 1로 인쇄하고, 입력 라인 3과 4를 출력 라인 2로 인쇄하는 등...)
편집: 이 규칙은 파일 이름이 아닌 모든 N=2 파일을 기반으로 합니다.
답변1
아마도
$ ls *.fastq | xargs -n2
Bar_R1.fastq Bar_R2.fastq
Bar_R3.fastq Foo_R1.fastq
Foo_R2.fastq Foo_R3.fastq
Paleo_R1.fastq Paleo_R2.fastq
Vegan_R1.fastq Vegan_R2.fastq
또는 열 출력의 경우
$ ls *.fastq | xargs -n2 | column -t
Bar_R1.fastq Bar_R2.fastq
Bar_R3.fastq Foo_R1.fastq
Foo_R2.fastq Foo_R3.fastq
Paleo_R1.fastq Paleo_R2.fastq
Vegan_R1.fastq Vegan_R2.fastq
( >> file.txt
파일에 출력을 추가하려면 명령에 추가)
두 예제 모두 공백이 없는 파일 이름에만 작동합니다.
공백이 있는 파일의 경우:
$ for i in *.fastq; do echo -ne "$i\0"; done | xargs -0 -n2
답변2
이미 가지고 있는 솔루션을 사용하여 다음을 수행하세요.아니요파일 이름 접두사 지정 Vegan
:
for file in *_R1.fastq; do
printf '%s %s\n' "$file" "${file%_R1.fastq}_R2.fastq"
done >file.txt
각 출력 명령 대신 루프 후에 사용하고 리디렉션하는 것은 printf
개인적으로 선호하는 것입니다.
주어진 파일 이름에 대해 다음을 file.txt
생성합니다 .
Paleo_R1.fastq Paleo_R2.fastq
Vegan_R1.fastq Vegan_R2.fastq
답변3
한 가지 옵션은 원하는 파일 이름을 현재 쉘 인수로 설정한 다음 printf
쌍으로 인쇄하도록 요청하는 것입니다.
set -- *
printf '%s %s\n' "$@" > output
또는 특정 파일만:
set -- *_R?.fastq
순서는 사용하는 와일드카드의 확장에 따라 달라집니다. 정렬을 더 효과적으로 제어하려면 다음과 같이 전역을 수동으로 분할할 수 있습니다.
set -- Paleo*.fastq Vegan*.fastq Omnivore*.fastq FastFood*.fastq