web-dev-qa-db-ja.com

シェルコマンドを使用してASCIIファイルの最初のn行を削除するにはどうすればよいですか?

最初の5〜10行にASCIIテキスト情報が含まれている複数のファイルがあり、その後によく表化されたマトリックス情報が続きます。シェルスクリプトでは、これらの最初の数行のテキストを削除して、純粋なマトリックス情報を別のプログラムで使用できるようにします。これを行うには、bash Shellコマンドをどのように使用できますか?

それが助けになるなら、私はRedHatとUbuntu linuxシステムを使っています。

108
Paul

ファイルがシンボリックリンクまたはハードリンクでない限り、sed、tail、またはawkを使用できます。以下の例。

$ cat t.txt
12
34
56
78
90

sed

$ 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

$ awk 'NR > 3 { print }' < t.txt
78
90
165

sed -i '1,3d' file.txt

これにより、file.txtの最初の3行が削除されます。

15
alhelal

表形式の行がタブ文字を持つ行である場合:

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. 1最初の行に移動

  2. 5 5行を選択

  3. d削除

  4. x保存して閉じる

2
Steven Penny
# 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' 
0
Samran Elahi

パーセンテージ

bashを使用して、絶対的な行数ではなくパーセント値を使用してファイルをクリーンアップします。

sed -i -e 1,$( printf  "$((`cat php_errors.log | wc -l` * 75 /100 ))" )d php_errors.log

コピーを作成せずにコンテンツをインプレースで削除するため、このコマンドは破壊的なものになる可能性があるので注意してください。

上記のファイルから行の最初の75%を削除します。

0
pgr