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で指定されており、後者が簡単です。実際の移植性のためにコード例を置き換えてくださいed
。ex