ファイルの特定の行にテキストを挿入する方法は?使用できる最も簡単な方法は何ですか? ( bash
,,, sed
? awk
)
私がしたいことはおそらく簡単ですが、どこから始めるべきかわかりません。これを手動で実行するには時間がかかりすぎます(後でExcel / Calcで使用するために変更する必要があるファイルが多い)。
以下は私の入力ファイルの例です。
4.06
4.05
5.04
4.06
34.50
56.06
45.33
36.44
私は次のことをしたいと思います(1行と5行の前にテキストが挿入されています)。
Exp1
4.06
4.05
5.04
4.06
Exp2
34.50
56.06
45.33
36.44
どうすればいいですか?
答え1
awk 'NR==1{print "Exp1"}NR==5{print "Exp2"}1' file
1つの結末はを意味します{print}
。
sed '1i\
Exp1
5i\
Exp2
' file
これをより多くの数に拡張するのはawk
簡単です。
awk 'NR%4==1{print "Exp"++i}1' file
数値が異なる場合は、sedがその作業に適したツールではないとします。可能ですが、きれいではありません。
学問的好奇心で、次のようにsedにあります。
sed '1{
h
s/^.*$/Exp0/
x
}
x
s/^4//
s/^3/4/
s/^2/3/
s/^1/2/
/^E/ {
s/$/|/
:x
s/0|/1/
s/1|/2/
s/2|/3/
s/3|/4/
s/4|/5/
s/5|/6/
s/6|/7/
s/7|/8/
s/8|/9/
s/9|/|0/
tx
s/^Exp|/Exp1/
p
s/^/1/
}
x' file
答え2
各実験のデータポイント数が常に4つある場合は、次のPerlシングルライナーを使用できます。
perl -ple '$. % 4 == 1 and print "Exp", ++$i' your_file
どのように動作しますか?
- この
-p
スイッチはPerlに与えられたファイルを1行ずつ(デフォルトで)繰り返し、ユーザーが提供したコードを実行した後に各行を印刷するように指示します。 - この
-l
スイッチは、Perlに自動的にprint
各ステートメントに改行文字を追加するように指示します(デフォルト)。 - この
-e
スイッチは、Perlに次に実行されるコード(ファイルの各行が印刷される前に実行されるコード)があることを知らせます。 - 特殊変数は、
$.
現在処理中の行番号を保持します。行番号が1モジュロ4()に等しい場合は、その前に挿入する$. % 4 = 1
必要があります。Exp #
- だから私たちはテストし、
$. % 4 == 1
真であれば印刷しますExp ++$i\n
(\n
スイッチによって追加された場所-l
)。これは、未定義の変数が整数として最初に使用されたときにPerlにゼロ値を割り当てるために機能します。
複数のファイルで動作するようにする
$.
一度に複数のファイルを処理する場合、この変数は値をリセットしません。明らかに、これはあなたが望むものではありません。ブロック-p
を操作できるように、上記の行で生成された暗黙的なループを明示的に作成することで、この問題を解決できますcontinue
。perl -le ' while(<>){ $. % 4 == 1 and print "Exp ",++$i } continue { print; # Print the current line if(eof){ # If the next line is the end-of-file close ARGV ; # Close the current filehandle to reset $. $i = 0 ; # Reset the experiment counter if you need } } ' list_of_your_files
ノート
上記の両方のソリューションは、変更されたファイルを標準出力として印刷します。内部編集(つまり、ファイル自体の編集)をシミュレートするには、
-i
スイッチを追加します。perl -pi -le '$. % 4 == 1 and print "Exp", ++$i' your_file
- 他のソリューションでも同様のことをしてください。
スイッチの直後に他のスイッチを置かないでください。スイッチ
-i
は、その後のすべてのスイッチをバックアップファイルの作成に使用される拡張子として解釈するためです。-i
今はテストせず、結果に満足したら追加することをお勧めします。
答え3
外部言語は必要なく、いくつかの標準コマンドを使用するだけです。たとえば、Origin.txtの5行目に一部のコンテンツを挿入するには、次の手順を実行します。
tmpfile=`mktemp`
head -n4 origin.txt > $tmpfile
echo "I'm line 5 now" >> $tmpfile
tail -n +5 origin.txt >> $tmpfile
mv $tmpfile origin.txt
答え4
ファイルの指定された行の先頭にコメント(#)記号を追加する方法を探しているこの質問が見つかりました。上記の例とは異なるいくつかの例を使用して、これが指定された行に何かを印刷するawkコマンドであることがわかりました。
awk 'NR==1{print "#"$0; next}1' <file
NR==1
考慮すべきラインです。提供された行の残りの部分を含む文字列に挿入してその行を
print "#"
スキップするように指示し(すでに印刷されているので、そうでない場合は2回表示されます)、上記のようにファイルの残りの部分に末尾の挿入を行います。 $0
next
1