あるファイルの最初の7行を別のファイルの内容に置き換えます。

あるファイルの最初の7行を別のファイルの内容に置き換えます。

2つのファイルがあります。一つは吠えてfile1.txt、もう一つはperson1.txt。次の例に示すように、すべて数行のテキストが含まれています。

  • file1.txt
    word1
    word2
    word3
    word4
    word5
    word6
    word7
    word8
    word9
    
  • person1.txt
    givi sixarulidze
    

私がしたいことは、コードfile1.txtの最初の7行をperson1.txt

  • 希望の出力:
    givi sixarulidze
    word8
    word9
    

どうすればいいですか?

答え1

cp person1.txt result.txt
tail -n+8 file1 >> result.txt

答え2

GNUを使用したsponge内部編集file1.txt

{ cat person1.txt; tail -n +8 file1.txt; } | sponge file1.txt

これにより、person1.txtファイルの最初の7行を除くすべての行がファイルに関連付けられ、file1.txt結果がfile1.txt

sedあなたは同じことをします

sed -e '1r person1.txt' -e '1,7d' file1.txt | sponge file1.txt

8,$!d(代わりに使用可能1,7d)またはGNUを使用しているsed場合

sed -i -e '1r person1.txt' -e '1,7d' file1.txt

person1.txtこれにより、内容が最初に挿入され、次にfile1.txt入力ファイルの最初の7行がスキップされます。

答え3

別の可能性は次のとおりですawk

awk 'NR==FNR || FNR>7' person1.txt file1.txt > result.txt

person1.txtこの内容が最初に処理され、処理されますfile1.txt。可能であれば、現在の行を印刷します。

  • 私たちは2つのファイルの最初のファイルを処理しています。ここでNR(グローバルラインカウンタ)はFNR各ファイルのラインカウンタと同じである。または
  • ファイルごとのラインカウンタが7より大きい。 (これは2番目のファイルを処理するための制限にすぎず、現在はNR大きいですFNR。)

スキップしたい各ファイルの行仕様に拡張することもできます。

awk -- '--skip<=0' person1.txt skip=7 file1.txt skip=4 file2.txt >result.txt

次に、各ファイル名の前に変数割り当てを追加し、その入力ファイルからスキップしたい行数でawk変数を設定します。skipプログラムは、awk処理された各行について、この変数(1ずつ減少した場合)が0未満であることを確認します。これは、スキップされた行数に達したことを示します。これにより条件が適用され、true現在の行が印刷されます。

--実際のプログラムの最初のコマンドはで終わるため、「オプションの終わり」指定子が必要です--

答え4

$ ed file1
1,7d
0r person1
w
q

またはスクリプトとして:

ed -s file1 <<'EOF'
1,7d
0r person1
w
q
EOF

または

printf '%s\n' 1,7d '0r person1' w q | ed -s file1

今日では、ex(using vi)は(using)よりも一般的ですが、edどちらもPOSIXで指定されており、後者が簡単です。実際の移植性のためにコード例を置き換えてくださいedex

関連情報