最初の5〜10行にASCIIテキスト情報が含まれている複数のファイルがあり、その後によく表化されたマトリックス情報が続きます。シェルスクリプトでは、これらの最初の数行のテキストを削除して、純粋なマトリックス情報を別のプログラムで使用できるようにします。これを行うには、bash Shellコマンドをどのように使用できますか?
それが助けになるなら、私はRedHatとUbuntu linuxシステムを使っています。
ファイルがシンボリックリンクまたはハードリンクでない限り、sed、tail、またはawkを使用できます。以下の例。
$ cat t.txt
12
34
56
78
90
$ sed -e '1,3d' < t.txt
78
90
一時ファイルなしでsed in-placeを使用することもできます:sed -i -e 1,3d yourfile
。これは何もエコーしません。ファイルをインプレースで変更するだけです。結果を別のコマンドにパイプする必要がない場合、これは簡単です。
$ tail -n +4 t.txt
78
90
$ awk 'NR > 3 { print }' < t.txt
78
90
sed -i '1,3d' file.txt
これにより、file.txtの最初の3行が削除されます。
表形式の行がタブ文字を持つ行である場合:
grep '␉' <input_file >output_file
(␉
はリテラルのタブ文字です)または同等
sed -n '/␉/p' <input_file >output_file
Bash/ksh/zshスクリプトでは、タブに$'\t'
を書き込むことができます。 grep $'\t'
またはsed -n $'/\t/p'
。
ファイルの先頭の10行を削除する場合は、次のようにします。
tail -n +11 <input_file >output_file
(+11
は「行11から開始」を意味し、テール番号行は1からであるため、10行を削除するのは+11
であることに注意してください)または
sed '1,10d' <input_file >output_file
Linuxでは、GNU sedの-i
オプションを利用して、適切な場所でファイルを変更できます。
sed -i -n '/\t/p' *.txt
または、シェルループと一時ファイルを使用できます。
for x in *.txt; do
tail -n +11 <"$x" >"$x.tmp"
mv "$x.tmp" "$x"
done
または、ファイルをインプレースで変更したくないが、代わりに別の名前を付けたい場合:
for x in *.txt; do
tail -n +11 <"$x" >"${x%.txt}.data"
done
VimはExモードで使用できます。
ex -sc '1d5|x' file
1
最初の行に移動
5
5行を選択
d
削除
x
保存して閉じる
# deletes first line
echo "a\nb" | sed '1d'
# read list.txt and write list.csv without first line
cat list.txt | sed '1d' > list.csv
その他の便利なコマンド:
# finds first character (pipe|)
grep '^|'
# deletes pipe
sed 's/|//g'
# deletes space
sed 's/ //g'
bash
を使用して、絶対的な行数ではなくパーセント値を使用してファイルをクリーンアップします。
sed -i -e 1,$( printf "$((`cat php_errors.log | wc -l` * 75 /100 ))" )d php_errors.log
コピーを作成せずにコンテンツをインプレースで削除するため、このコマンドは破壊的なものになる可能性があるので注意してください。
上記のファイルから行の最初の75%を削除します。