我有一个以下格式的文本文件:-
$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 行并从三行集中提取 9 个数值,所有这些值都使用 awk 命令放在 9 个不同的输出文件中。
输出文件的示例是:-
File1.txt
1 2 3 。 。 1000
文件2.txt
1.361e-11 1.339e-11 1.334e-11 。 。 。 1.339e-11
对于三行集合中的所有九个元素都是相同的。
答案1
这是一个纯粹的awk
解决方案:
awk '
NR<=5 { next }
{ for(i=1; i<=NF; i++) print $i > "File"++c}
NF==2 { c=0 }
'
它跳过五行标题,打印文件中剩余数据的字段,其名称由计数器定义,该计数器在只有两个字段的行上重置。
答案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