
次の形式のテキストファイルがあります。
$DATA1ソース='HSPICE'バージョン='I-2013.12-SP2-1 32ビット' .TITLE「CMOSインバータ伝送特性」 インデックス t_r t_ft t_rf t_fr t_rr t_ff 性格変化# 1 1.361e-11 1.177e-11 8.807e-12 9.063e-12 2.002e-08 2.002e-08 2.500e+01 1 2 1.339e-11 1.178e-11 8.805e-12 8.867e-12 2.002e-08 2.002e-08 2.500e+01 1 3 1.334e-11 1.177e-11 8.811e-12 8.824e-12 2.002e-08 2.002e-08 2.500e+01 1 。 。 。 1000 1.339e-11 1.178e-11 8.805e-12 8.867e-12 2.002e-08 2.002e-08 2.500e+01 1
最初の5行を削除し、3行セットから9つの値を抽出したいと思います。これらの値はすべて、awkコマンドを使用して9つの異なる出力ファイルに配置されます。
出力ファイルの例は次のとおりです。 -
File1.txt
1 2 サム 。 。 1000
ファイル2.txt
1.361e-11 1.339e-11 1.334e-11 。 。 。 1.339e-11
3行セットの9つの要素はすべて同じです。
答え1
純粋なawk
解決策は次のとおりです。
awk '
NR<=5 { next }
{ for(i=1; i<=NF; i++) print $i > "File"++c}
NF==2 { c=0 }
'
5つのヘッダー行をスキップし、ファイルに残っているデータを含むフィールドを印刷します。その名前は、2つのフィールドのみがある行でリセットされるカウンタによって定義されます。
答え2
bareでも可能ですawk
が、私が最初に考えたのはsed
+awk
組み合わせでした。
sed '1,5d;s/^\([[:digit:]]\)/\n\1/' file |
awk 'BEGIN{RS="\n\n"}{for(i=1;i<=NF;i++){print $i > "file"i".txt"}}'
ポイントは、sed
次から始まるすべての行に新しい行を追加(使用)することです。数字を選択してから、レコード区切り文字を再定義しますawk
。
答え3
もう一つの利点は次のとおりですsed
。tr
printf
tr -s '[:space:]' \\n <infile |
sed "/^[0-9]/,${$(
printf '\nw file%b\nn' \
1 2 3 4 5 6 7 8 '9\n}\c'
)"
クリップボードで実行し、例をバッファにコピーして出力をパイプしてxsel
.../tmp
head -n3 /tmp/file?
...印刷...
==> /tmp/file1 <==
1
2
3
==> /tmp/file2 <==
1.361e-11
1.339e-11
1.334e-11
==> /tmp/file3 <==
1.177e-11
1.178e-11
1.177e-11
==> /tmp/file4 <==
8.807e-12
8.805e-12
8.811e-12
==> /tmp/file5 <==
9.063e-12
8.867e-12
8.824e-12
==> /tmp/file6 <==
2.002e-08
2.002e-08
2.002e-08
==> /tmp/file7 <==
2.002e-08
2.002e-08
2.002e-08
==> /tmp/file8 <==
2.500e+01
2.500e+01
2.500e+01
==> /tmp/file9 <==
1
1
1