9

150 GB の大きな CSV ファイルがあり、最初の 17 行と最後の 8 行を削除したいと考えています。私は次のことを試しましたが、正しく機能していないようです

sed -i -n -e :a -e '1,8!{P;N;D;};N;ba' 

sed -i '1,17d' 

誰かがsedまたはawkを手伝ってくれるのだろうか、1つのライナーは素晴らしいでしょうか?

4

7 に答える 7

18

headとはまたはtailよりも仕事に適しています。sedawk

tail -n+18 file | head -n-8 > newfile
于 2013-02-07T13:36:28.777 に答える
10
awk -v nr="$(wc -l < file)" 'NR>17 && NR<(nr-8)' file
于 2013-02-07T13:46:02.047 に答える
2

すべてのawk:

awk 'NR>y+x{print A[NR%y]} {A[NR%y]=$0}' x=17 y=8 file
于 2013-03-08T01:31:14.087 に答える
1
Try this :

sed '{[/]<n>|<string>|<regex>[/]}d' <fileName>       
sed '{[/]<adr1>[,<adr2>][/]d' <fileName>

どこ

  1. /.../=区切り記号

  2. n = 行番号

  3. string = 行内で見つかった文字列

  4. regex = 検索されたパターンに対応する正規表現

  5. addr = 行のアドレス (数値またはパターン)

  6. d = 削除

このリンクを参照してください

于 2013-02-07T13:37:41.377 に答える
0

今日、シェルについてこれを学びました。

{
  ghead -17  > /dev/null
  sed -n -e :a -e '1,8!{P;N;D;};N;ba'
} < my-bigfile > subset-of

消費しない を使用する必要があるheadためghead、GNU coreutils から を使用します。

于 2013-02-07T14:17:33.870 に答える
0
LENGTH=`wc -l < file`
head -n $((LENGTH-8)) file | tail -n $((LENGTH-17)) > file

編集:mtkがコメントに投稿したように、これは機能しません。wcファイルの長さを使用して追跡する場合は、次を使用する必要があります。

LENGTH=`wc -l < file`
head -n $((LENGTH-8)) file | tail -n $((LENGTH-8-17)) > file

また:

LENGTH=`wc -l < file`
head -n $((LENGTH-8)) file > file
LENGTH=`wc -l < file`
tail -n $((LENGTH-17)) file > file

このソリューションがチョロバによって投稿されたソリューションよりもエレガントではない理由:)

于 2013-02-07T13:37:21.893 に答える