1

タブで区切られたさまざまなデータのテーブルを含む大きなファイルがあります。異なるテーブルは空白行で区切られています。

特定のテーブルの開始行番号があり、テーブル全体を取得する必要があります。

特定の行番号の後の次の空白行の行番号を取得するために grep (または同様のもの) を使用するにはどうすればよいですか?

4

4 に答える 4

4

これに使用するsedと、これでうまくいくはずです:

sed -n '1,/^\s*$/p' file

コンマの前の最初の数字を行番号に置き換えるだけです。この場合1は、特定の行番号から各テーブルを出力するデモです。

$ cat file
one
two
three

five
six
seven

nine
ten
eleven

$ sed -n '1,/^\s*$/p' file
one
two
three

$ sed -n '5,/^\s*$/p' file
five
six
seven

$ sed -n '9,/^\s*$/p' file
nine
ten
eleven

-nオプションを使用してすべての行のデフォルトの印刷を無効にすると、行番号から正規表現に一致する最初の行までpフラグが印刷されます。sed

^     # Matches the start of the line
\s*   # Matches zero or more whitespace characters
$     # Matches the end of the line

sed -n 'A,Bp'行番号または正規表現のいずれかであるフォーマットを使用するAB、ファイルのサブセクションを簡単に印刷できます。

次の空白行の行番号だけを表示するには、次のようにしsedます。

$ sed -n '1,/^\s*$/{=}' file | tail -1
4

$ sed -n '5,/^\s*$/{=}' file | tail -1
8

$ sed -n '9,/^\s*$/{=}' file | tail -1
12

または、すべての空白行がある場所を印刷するだけです

$ sed -n '/^\s*$/{=}' file
4
8
12

を使用して次の空白行番号を取得するには、次awkを使用する必要はありませんtail:

$ awk 'NR>=1 && /^\s*$/{print NR;exit}' file
4

$ awk 'NR>=5 && /^\s*$/{print NR;exit}' file
8

$ awk 'NR>=9 && /^\s*$/{print NR;exit}' file
12

$ awk '/^\s*$/{print NR}' file
4
8
12

より明確になる場合は、をawk使用して変数を渡すことができます-v

$ awk -v start=1 'NR>=start && /^\s*$/{print NR;exit}' file
4

$ awk -v start=5 'NR>=start && /^\s*$/{print NR;exit}' file
8

$ awk -v start=9 'NR>=start && /^\s*$/{print NR;exit}' file
12
于 2013-01-11T10:05:57.907 に答える
2

Perlはこれを簡単にします。31行目からsome_fileの次の空白行までのすべての行を抽出するには:

$ perl -wne 'print if 31 .. /^$/' some_file
于 2013-01-11T12:14:24.807 に答える
0

awkの片道:

awk -vs=$sta '{ok=NR>=s}ok&&!$0{exit;}ok&&$0'

$staは変数であり、開始行番号を格納します。開始行nr=5を使用してsudo_Oの入力例でテストすると、次のようになります。

kent$  sta=5

kent$  echo "1
2
3

5
6
7

9
10
11"|awk -vs=$sta '{ok=NR>=s}ok&&!$0{exit;}ok&&$0'
5
6
7

sedのアドレスには境界が含まれることに注意してくださいつまり、ターゲットテーブルの後の空の行も出力されます。このawkワンライナーはそれを印刷しません。よくそれはあなたが出力に望むものに依存します。

次の空の行番号を取得したい場合は編集してください

awk -vs=$sta 'NR>=s&&!$0{print NR;exit;}' file
于 2013-01-11T10:25:45.823 に答える
0

以下のコマンドの 5 は、テーブルの既知の行番号です。

perl -lne 'exit if(/^$/ && $.>5);if($.>=5){print}' your_file
于 2013-01-11T10:43:50.367 に答える