앗

1000개의 파일이 있는 폴더가 있습니다. 앞의 모든 문자는 mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp개인 ID를 나타냅니다(예: NA21117, NA21119, NA21126, ..).

NA21117.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21119.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21126.mapped.ILLUMINA.bwa.GIH.low_coverage.20121211.bam_dp
NA21127.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21137.mapped.ILLUMINA.bwa.GIH.low_coverage.20120522.bam_dp
NA21142.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
NA21143.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp

각 파일에는 한 줄만 있습니다.

cat NA21143.mapped.ILLUMINA.bwa.GIH.low_coverage.20130415.bam_dp
1   115258827   10

각 파일에 대해 개별 ID를 파일 내용에 붙여넣고 다음과 같은 출력을 얻고 싶습니다.

1   115258827   10 NA21143

그것을 할 수 있는 방법이 있나요?

답변1

일반 배쉬

for file in *.bam_dp; do 
    contents=$(< "$file")
    echo "$contents ${file%%.*}" > "$file"
done

여러 줄 파일의 경우 일반 bash를 사용하여 수행할 수 있습니다.

for file in *.bam_dp; do 
    mapfile -t contents < "$file"
    printf "%s\n" "${contents[@]/%/ ${file%%.*}}" > "$file"
done

노트:

  • mapfile명령은 파일을 행 배열로 읽습니다.
  • 매개변수 ${var/pattern/string}확장은 변수 값을 검색하고 대체합니다. (파일에 기록설명서에)
    • 패턴이 패턴으로 시작하는 경우 %패턴은 문자열 끝에 고정됩니다. 여기서는 문자열 끝의 빈 패턴을 일치시킵니다.
    • 변수는 배열 확장일 수 있으며, 이 경우 각 배열 요소에 대해 대체가 발생합니다.

솔직히 말해서 이 접근 방식은 너무 영리해서 좀 더 확실한 접근 방식을 선택했을 것입니다.

답변2

루프를 사용하십시오.

#!/bin/bash

shopt -s nullglob
for file in ???????.mapped.*bam_dp; do
  [[ -f "$file" ]] || continue
  id=${file%%.*}              # grab the ID from file name
  sed -i "s/$/ $id/" "$file"  # modify the file in-place
done

답변3

$ARGV에서 .*를 제거하고 파일에 \t $ARGV를 추가합니다.

perl -i -pe '$ARGV=~s/\..*//; s/$/\t$ARGV/;' NA*

Glenn의 솔루션은 아마도 더 빠르게 실행될 것입니다.

perl -i -lpe '$_ .= " " . substr($ARGV,0,index($ARGV,"."))' NA*

그러나 파일당 한 줄만 있으면 대부분의 시간 동안 드라이브를 보게 됩니다.

답변4

이 방법은 GNU(Linux) 및 BSD(Mac) 버전에서 작동합니다 awk.

awk '{ id=FILENAME ; sub(/\..*/,"",id) ; print $0 "\t" id }' *.bam_dp
  • id=FILENAME ; sub(/\..*/,"",id)
    각 파일 이름의 첫 번째 부분 *.bam_dp(첫 번째 이전의 모든 항목 .)을 id.
  • print $0 "\t" id
    각 파일의 내용을 인쇄한 다음 탭, 레코드를 인쇄합니다 id.

예제에 표시된 대로 행 목록이 인쇄됩니다.

1   115258827   10 NA21143

원본 파일은 수정되지 않습니다. 예를 들어 명령 끝에 추가하여 > file.txt이 출력을 저장할 수 있습니다.

관련 정보