他のファイルの内容で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(1つずつ交換したいとき)
  • ' '私のものを交換する'\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/

その後、2番目の項目によって実行されます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

関連情報