다른 파일의 내용으로 sed 편집 헤더

다른 파일의 내용으로 sed 편집 헤더

다른 파일의 내용을 기반으로 파일의 기존 헤더를 바꾸려고 합니다.

파일 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문자열의 각 항목을 genesfile1의 연속 항목으로 바꿔야 합니다. 단, 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

첫 번째 sednames.insed 스크립트:

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/

파일을 내부에서 편집하지는 않습니다. 이렇게 하려면 sedwith -i(지원되는 경우)를 사용하거나 >출력을 다음으로 newfile리디렉션 하세요.mv newfile datafile.tsv

관련 정보