タブで区切られたさまざまなデータのテーブルを含む大きなファイルがあります。異なるテーブルは空白行で区切られています。
特定のテーブルの開始行番号があり、テーブル全体を取得する必要があります。
特定の行番号の後の次の空白行の行番号を取得するために grep (または同様のもの) を使用するにはどうすればよいですか?
これに使用する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'行番号または正規表現のいずれかであるフォーマットを使用するAとB、ファイルのサブセクションを簡単に印刷できます。
次の空白行の行番号だけを表示するには、次のようにし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
Perlはこれを簡単にします。31行目からsome_fileの次の空白行までのすべての行を抽出するには:
$ perl -wne 'print if 31 .. /^$/' some_file
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
以下のコマンドの 5 は、テーブルの既知の行番号です。
perl -lne 'exit if(/^$/ && $.>5);if($.>=5){print}' your_file