txt 파일의 특정 줄에 여러 파일 이름을 인쇄합니다.

txt 파일의 특정 줄에 여러 파일 이름을 인쇄합니다.

파일 이름 목록을 텍스트 파일로 인쇄하려고 하는데 특정 파일 이름을 같은 줄에 인쇄해야 합니다. 예를 들어 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

관련 정보