他のファイルの内容に基づいてファイルの既存のヘッダーを置き換えようとしています。
ファイル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
文字列内の各項目を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/
その後、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/
ファイルを内部で編集することはありません。これを行うには、sed
with -i
(サポートされている場合)を使用するか、>
出力を次にnewfile
リダイレクトします。mv newfile datafile.tsv