web-dev-qa-db-ja.com

SEDまたはAWKを使用してファイルから行を削除する

私は多くのバリエーションを見てきましたが、これら3つの問題を解決する方法について非常に混乱しています。

  1. ファイルから最初の行を除くすべての行を削除する
  2. 行番号のあるファイルから行を削除する
  3. 行番号の範囲を持つファイルから行を削除する
15
bluetickk

Sedの使用:

1行目を削除します。

sed '1d' file-name

10行目を削除します。

sed '10d' file-name

5行目から10行目を削除します

sed '5,10d' file-name

上記のすべてのsedコマンドは、必要に応じて別のファイルにリダイレクトできる出力をstdoutに書き込むか、sedの-iフラグを使用してファイルをインライン編集します。

28
anubhava

Awk付き:

# delete line 1
awk 'NR == 1 {next} {print}' file

# delete line number stored in Shell variable $n
awk -v n=$n 'NR == n {next} {print}' file

# delete between lines $a and $b inclusive
awk -v m=$a -v n=$b 'm <= NR && NR <= n {next} {print}' file

いくつかの文字を節約するために、{print}1に置き換えることができます

元のファイルを上書きするには、次のような操作を行う必要があります

awk '...' file > tmpfile && mv tmpfile file
7
glenn jackman

システムにbashがあれば、bashを使用できます。背後にある基本的な考え方は、カウントを設定し、ファイルを反復しながらこのカウントをインクリメントすることです。

1)ファイルから最初の行を除くすべての行を削除する

read -r line < file; echo "$line" > temp && mv temp file

2)行番号のあるファイルから行を削除する

declare -i count=0
while read -r line
do
  ((count++))
  case "$count" in
    10) continue;;
    * ) echo "$line";;
  esac
done < file > temp && mv temp file

3)行番号の範囲(10〜20など)のファイルから行を削除する

declare -i count=0
while read -r line
do
  ((count++))
  if (( $c < 10 && $c > 20 ));then
    echo "$line";;
  fi
done < file > temp && mv temp file
0
bash-o-logist