다른 파일의 내용을 기반으로 파일의 기존 헤더를 바꾸려고 합니다.
파일 1 - name.in:
name1
name2
name3
name4
name5
파일 2-데이터 file.tsv:
chr begin end genes genes genes genes genes
File2
더 많은 행이 포함되어 있지만 제목이 다음과 같이 되도록 첫 번째 행에 있는 문자열의 각 항목을 genes
연속 항목으로 바꾸고 싶습니다 .file1
chr begin end name1.Corrected name2.Corrected name3.Corrected name4.Corrected name5.Corrected
다음 스크립트를 시도했습니다.
genenames=$1
sed -i -e "1s/\tgenes/\t$genenames\.Corrected/g" Datafile.tsv
하지만 다음과 같이 실행하면:
./sed.sh names.in
내가 얻는 결과는 다음과 같습니다.
chr begin end .in.Corrected .in.Corrected .in.Corrected .in.Corrected .in.Corrected
스크립트가 입력을 읽지 않는다는 것을 이해할 수 있습니다.
답변1
노력하다
for x in $(<names.in)
do
sed -i -s "s/ genes/ ${x}.Corrected/" Datafile.tsv
done
cat Datafile.tsv
chr begin end name1.Corrected name2.Corrected name3.Corrected name4.Corrected name5.Corrected
- 모든 이벤트에 적용되는 플래그를 사용하지 마세요
/g
(하나씩 교체하고 싶을 때) ' '
내 것을 교체하다'\t'
$names.in
"이름 변수의 값"(.in에 연결됨)으로 확장되며, .in으로 확장될 수도 있습니다.$(< name.in )
명령이 실행되기 전에 파일 이름.in을 읽고 파일 내용으로 바꿉니다. (줄 끝이 흰색으로 변합니다.)
더욱 포괄적인 쉘
cat "$1" | while read x
do
sed -i -s "s/ genes/ ${x}.Corrected/" "$2"
done
~라고 불리는
myscript.sh names.in Datafile.tsv
답변2
내가 올바르게 이해했다면 이름을 읽고 file1
문자열의 각 항목을 genes
file1의 연속 항목으로 바꿔야 합니다. 단, file2의 첫 번째 줄에서만 가능합니다. 그렇다면 다음과 같이 할 수 있습니다( genes
예를 들어 문자열을 하위 문자열로 사용하지 않는다고 가정 mygenes
).
while read name
do
sed -i "1s/genes/$name.Corrected/" file2
done < file1
또는 간단히 file1의 내용을 연결하고 모든 것을 한 번에 바꿀 수 있습니다.
names=$(perl -pe 's/\n/.Corrected /' file1)
sed -i "1s/genes .*/$names/" file2
답변3
아무것도 비교되지 않는다텍스트를 처리할 때 루프를 반복 while read
하지만, 텍스트를 처리하려는 경우를 대비해datafile.tsv
한번만:
sed 's|\(.*\)|1s/genes/\1.Corrected/|' names.in | sed -f - datafile.tsv
첫 번째 sed
는names.in
sed 스크립트:
1s/genes/name1.Corrected/
1s/genes/name2.Corrected/
1s/genes/name3.Corrected/
1s/genes/name4.Corrected/
1s/genes/name5.Corrected/
그런 다음 두 번째 항목에 의해 실행됩니다 sed
.
만약 당신의 모든유전자열은 연속되어 있습니다(예제 입력과 마찬가지로). 다음을 실행할 수도 있습니다.
tr \\n \\t <names.in | \
sed -E 's|\t|.Corrected&|g;s|(.*).$|1s/genes.*genes/\1/|' | \
sed -f - datafile.tsv
sed
마지막 항목이 다음을 수행한다는 점에서 첫 번째 항목과 유사합니다.sed 스크립트:
1s/genes.*genes/name1.Corrected name2.Corrected name3.Corrected name4.Corrected name5.Corrected/
파일을 내부에서 편집하지는 않습니다. 이렇게 하려면 sed
with -i
(지원되는 경우)를 사용하거나 >
출력을 다음으로 newfile
리디렉션 하세요.mv newfile datafile.tsv