
2番目の列に基づいて、以下のファイルを2つのファイルに分割するのに役立ちますか? (値1で始まるグループと次の2行を加算したグループは1つのファイルに存在し、値0.1で始まり、次の2行を加算したグループは1つのファイルになければなりません。1つのファイル)
A 1
A 10
A 100
B 0.1
B 1
B 10
C 1
C 10
C 100
D 0.1
D 1
D 10
期待される出力ファイル1:
A 1
A 10
A 100
C 1
C 10
C 100
期待される出力ファイル2:
B 0.1
B 1
B 10
D 0.1
D 1
D 10
ありがとうございます! !
答え1
$ cat tst.awk
!(c&&c--) {
out = "out" ($2 == 1 ? 1 : 2)
c = 2
}
{ print > out }
$ awk -f tst.awk file
$ head out?
==> out1 <==
A 1
A 10
A 100
C 1
C 10
C 100
==> out2 <==
B 0.1
B 1
B 10
D 0.1
D 1
D 10
バラより印刷には sed- または awk-a-line-follow-a-matching-pattern を使用します。what c&&c--
doesや他の同様のawkイディオムについてです。
答え2
次のawk
手順が機能します。
awk '$2=="1"&&!(n+m){n=1}
$2=="0.1"&&!(n+m){m=1}
n&&n<4{print > "file1.txt"; if (++n==4) n=0}
m&&m<4{print > "file2.txt"; if (++m==4) m=0}' input.txt
2番目の列を確認し、対応する値があるかどうかを確認1
します0.1
。
- その
1
場合、まだ回線グループに属していない場合、カウンタn
はに設定されます1
。このカウンタがゼロではなく、それより小さい場合、4
現在の行が印刷されますfile1.txt
(開始行と次の2行と同じ)。指定された行数に達すると、カウンタがゼロにリセットされ、行グループが完了したことを示します。 - 2番目のフィールドがある行でも同じです
0.1
。カウンタm
と出力ファイルのみが呼び出されますfile2.txt
。 - グループの開始は、まだグループ内にない場合にのみ確認されます(つまり、
m
両方がn
ゼロ)。
答え3
使用sed
:
sed -n \
-e '/[[:blank:]]1$/ {' -e 'N;N; w file1' -e '}' \
-e '/[[:blank:]]0\.1$/ {' -e 'N;N; w file2' -e '}' file
file1
現在の行が空白(空白またはタブ)で終わる場合、上記のコードは現在の行と次の2行です1
。
file2
現在の行が空白の後に続く場合、0.1
コードは現在の行と次の2行を名前付きファイルに書き込みます。
このN
コマンドは、sed
入力の次の行を編集バッファに追加し、w
バッファの現在の内容を指定されたファイルに書き込みます。