2番目の列値に基づいてファイルを分割する

2番目の列値に基づいてファイルを分割する

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バッファの現在の内容を指定されたファイルに書き込みます。

関連情報