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
이 출력을 저장할 수 있습니다.