在子文件中查找最小值和最大值并将结果与父文件相关联
我有一个如下所示的输入文件。
element materl(local)
ipt-shl stress sig-xx sig-yy sig-zz sig-xy sig-yz sig-zx plastic
state strain
1346995- 25
1- 2 elastic 5.9309E-01 -1.0920E-02 0.0000E+00 2.4431E-04 2.3158E-03 1.0608E-03 7.4616E-02
2- 2 elastic 6.1335E-01 -9.1746E-03 0.0000E+00 -4.2870E-04 2.3158E-03 1.0608E-03 7.4089E-02
3- 2 elastic 6.4586E-01 -7.3146E-03 0.0000E+00 -1.2961E-03 2.3158E-03 1.0608E-03 7.3794E-02
4- 2 elastic 6.7056E-01 -1.5564E-03 0.0000E+00 -1.0469E-03 2.3158E-03 1.0608E-03 7.3682E-02
5- 2 elastic 6.7493E-01 7.1420E-03 0.0000E+00 1.7934E-03 2.3158E-03 1.0608E-03 7.3708E-02
6- 2 elastic 6.7828E-01 1.4787E-02 0.0000E+00 5.4871E-03 2.3158E-03 1.0608E-03 7.3825E-02
7- 2 elastic 6.8092E-01 1.9656E-02 0.0000E+00 8.2580E-03 2.3158E-03 1.0608E-03 7.4210E-02
1346996- 25
1- 2 elastic 6.0586E-01 -4.6476E-03 0.0000E+00 9.4464E-03 -1.9585E-03 -5.1396E-03 7.4299E-02
2- 2 elastic 6.2548E-01 -5.1646E-03 0.0000E+00 6.3450E-03 -1.9585E-03 -5.1396E-03 7.4147E-02
3- 2 elastic 6.5631E-01 -5.3780E-03 0.0000E+00 1.1554E-03 -1.9585E-03 -5.1396E-03 7.4000E-02
4- 2 elastic 6.7186E-01 -1.5611E-03 0.0000E+00 -3.7045E-03 -1.9585E-03 -5.1396E-03 7.3999E-02
5- 2 elastic 6.7481E-01 5.1501E-03 0.0000E+00 -7.2939E-03 -1.9585E-03 -5.1396E-03 7.4107E-02
6- 2 elastic 6.7769E-01 1.1733E-02 0.0000E+00 -1.0146E-02 -1.9585E-03 -5.1396E-03 7.4238E-02
7- 2 elastic 6.7946E-01 1.5462E-02 0.0000E+00 -1.1218E-02 -1.9585E-03 -5.1396E-03 7.4362E-02
等等。
我想做的是仅选择塑性应变下的列,将其放入另一个文件中,然后找到其中的最小值和最大值。问题是,当我转移到另一个文件时,我失去了身份 最大值或最小值位于 7 行顶部,即元素编号。我
awk '{ print $10 }' elout > Plastic.k # Shifting the required field to another file
sed -i -e '/^$/d' Plastic.k # removing all the empty lines
sed -n '/^[0-9]\{1\}/p' Plastic.k > tt # removing all lines with the first letter alphasbet.
mv tt Plastic.k
现在必须找到该文件 Plastic.k 中的最大值和最小值,然后在原始文件 elout 文件中找到该事件的元素编号(标识)。
有什么建议吗?
PS 通过身份我的意思是一组 7 行顶部的 7 位数字,后跟一个 - 符号 -
输出的形式将
min=7.3682E-02 at 1346995-25
max=7.4616E-02 at 1346995-25
不是 1346996-25,因为它在字段 10 处既没有最小值也没有最大值我有来自输入文件的此类数据,并希望在输出文件中获取输出。
如果这个输入格式稍微改变一下,如下所示,Potong 的答案就不起作用了。我尝试了很多尝试但无法理解。新的输入如下。
它就像一样。
element materl(local)
ipt-shl stress sig-xx sig-yy sig-zz sig-xy sig-yz sig-zx plastic
state strain
699425- 13
1- 16 elastic 4.9281E-01 5.9754E-02 0.0000E+00 -2.7210E-02 1.4192E-02 1.2603E-01 1.7112E-02
2- 16 elastic 4.6965E-01 4.8664E-02 0.0000E+00 -2.1255E-02 1.4192E-02 1.2603E-01 1.2814E-02
3- 16 elastic 4.3029E-01 2.6264E-02 0.0000E+00 -7.2280E-03 1.4192E-02 1.2603E-01 7.1400E-03
4- 16 elastic 3.1283E-01 -1.4079E-02 0.0000E+00 1.3315E-02 1.4192E-02 1.2603E-01 1.9514E-03
5- 16 elastic -3.4911E-01 -2.9740E-02 0.0000E+00 3.7036E-02 1.4192E-02 1.2603E-01 7.5132E-04
6- 16 elastic -4.5764E-01 -7.0891E-02 0.0000E+00 3.6667E-02 1.4192E-02 1.2603E-01 7.1070E-03
7- 16 elastic -4.8788E-01 -8.1926E-02 0.0000E+00 4.1023E-02 1.4192E-02 1.2603E-01 1.1321E-02
699426- 13
1- 16 elastic 3.5073E-01 6.2039E-03 0.0000E+00 -9.4607E-02 -3.4023E-03 -2.4265E-02 1.4478E-02
2- 16 elastic 3.5540E-01 8.6871E-03 0.0000E+00 -7.2062E-02 -3.4023E-03 -2.4265E-02 1.0498E-02
3- 16 elastic 3.6224E-01 7.2871E-03 0.0000E+00 -3.5263E-02 -3.4023E-03 -2.4265E-02 6.1994E-03
4- 16 elastic 2.3782E-01 -1.7772E-02 0.0000E+00 5.9101E-03 -3.4023E-03 -2.4265E-02 1.6298E-03
5- 16 elastic -2.3065E-01 -3.2565E-02 0.0000E+00 6.0890E-02 -3.4023E-03 -2.4265E-02 1.3029E-03
6- 16 elastic -3.0923E-01 -3.0984E-02 0.0000E+00 9.0408E-02 -3.4023E-03 -2.4265E-02 5.3680E-03
7- 16 elastic -3.3606E-01 -2.5992E-02 0.0000E+00 1.0568E-01 -3.4023E-03 -2.4265E-02 9.3878E-03
唯一的区别是,在此输出中,数字 1 到 7 的形式为 16,而不是 2。
请建议我进行更正。
I have an input file like below.
element materl(local)
ipt-shl stress sig-xx sig-yy sig-zz sig-xy sig-yz sig-zx plastic
state strain
1346995- 25
1- 2 elastic 5.9309E-01 -1.0920E-02 0.0000E+00 2.4431E-04 2.3158E-03 1.0608E-03 7.4616E-02
2- 2 elastic 6.1335E-01 -9.1746E-03 0.0000E+00 -4.2870E-04 2.3158E-03 1.0608E-03 7.4089E-02
3- 2 elastic 6.4586E-01 -7.3146E-03 0.0000E+00 -1.2961E-03 2.3158E-03 1.0608E-03 7.3794E-02
4- 2 elastic 6.7056E-01 -1.5564E-03 0.0000E+00 -1.0469E-03 2.3158E-03 1.0608E-03 7.3682E-02
5- 2 elastic 6.7493E-01 7.1420E-03 0.0000E+00 1.7934E-03 2.3158E-03 1.0608E-03 7.3708E-02
6- 2 elastic 6.7828E-01 1.4787E-02 0.0000E+00 5.4871E-03 2.3158E-03 1.0608E-03 7.3825E-02
7- 2 elastic 6.8092E-01 1.9656E-02 0.0000E+00 8.2580E-03 2.3158E-03 1.0608E-03 7.4210E-02
1346996- 25
1- 2 elastic 6.0586E-01 -4.6476E-03 0.0000E+00 9.4464E-03 -1.9585E-03 -5.1396E-03 7.4299E-02
2- 2 elastic 6.2548E-01 -5.1646E-03 0.0000E+00 6.3450E-03 -1.9585E-03 -5.1396E-03 7.4147E-02
3- 2 elastic 6.5631E-01 -5.3780E-03 0.0000E+00 1.1554E-03 -1.9585E-03 -5.1396E-03 7.4000E-02
4- 2 elastic 6.7186E-01 -1.5611E-03 0.0000E+00 -3.7045E-03 -1.9585E-03 -5.1396E-03 7.3999E-02
5- 2 elastic 6.7481E-01 5.1501E-03 0.0000E+00 -7.2939E-03 -1.9585E-03 -5.1396E-03 7.4107E-02
6- 2 elastic 6.7769E-01 1.1733E-02 0.0000E+00 -1.0146E-02 -1.9585E-03 -5.1396E-03 7.4238E-02
7- 2 elastic 6.7946E-01 1.5462E-02 0.0000E+00 -1.1218E-02 -1.9585E-03 -5.1396E-03 7.4362E-02
and so on.
What I am trying to do is to select only the column under plastic strain , put it to another file and then to find the minimum and maximim out of it. The problem is that when I shift to another file I loose the identity of
maximum of minimum which is at the top of 7 lines which is the element number. I used
awk '{ print $10 }' elout > Plastic.k # Shifting the required field to another file
sed -i -e '/^$/d' Plastic.k # removing all the empty lines
sed -n '/^[0-9]\{1\}/p' Plastic.k > tt # removing all lines with the first letter alphasbet.
mv tt Plastic.k
Now I have to find the maximum and minimum out of this file Plastic.k and then to find the element number(identity) of that occurence in elout file, the original file.
Any suggestions ?
P.S. by identity I mean the 7 digit number on the top of a group of 7 lines followed by a - symbol-
The output would be of the form
min=7.3682E-02 at 1346995-25
max=7.4616E-02 at 1346995-25
It would not 1346996-25 as it neither have the minimum nor the maximum at the field 10. I have such a data from an input file and want to get output in an output file.
If this input format is a little changed like as follows , the answer from Potong donesnt work. I tried a lot to understand but could not. The new input is as follows.
Its like same.
element materl(local)
ipt-shl stress sig-xx sig-yy sig-zz sig-xy sig-yz sig-zx plastic
state strain
699425- 13
1- 16 elastic 4.9281E-01 5.9754E-02 0.0000E+00 -2.7210E-02 1.4192E-02 1.2603E-01 1.7112E-02
2- 16 elastic 4.6965E-01 4.8664E-02 0.0000E+00 -2.1255E-02 1.4192E-02 1.2603E-01 1.2814E-02
3- 16 elastic 4.3029E-01 2.6264E-02 0.0000E+00 -7.2280E-03 1.4192E-02 1.2603E-01 7.1400E-03
4- 16 elastic 3.1283E-01 -1.4079E-02 0.0000E+00 1.3315E-02 1.4192E-02 1.2603E-01 1.9514E-03
5- 16 elastic -3.4911E-01 -2.9740E-02 0.0000E+00 3.7036E-02 1.4192E-02 1.2603E-01 7.5132E-04
6- 16 elastic -4.5764E-01 -7.0891E-02 0.0000E+00 3.6667E-02 1.4192E-02 1.2603E-01 7.1070E-03
7- 16 elastic -4.8788E-01 -8.1926E-02 0.0000E+00 4.1023E-02 1.4192E-02 1.2603E-01 1.1321E-02
699426- 13
1- 16 elastic 3.5073E-01 6.2039E-03 0.0000E+00 -9.4607E-02 -3.4023E-03 -2.4265E-02 1.4478E-02
2- 16 elastic 3.5540E-01 8.6871E-03 0.0000E+00 -7.2062E-02 -3.4023E-03 -2.4265E-02 1.0498E-02
3- 16 elastic 3.6224E-01 7.2871E-03 0.0000E+00 -3.5263E-02 -3.4023E-03 -2.4265E-02 6.1994E-03
4- 16 elastic 2.3782E-01 -1.7772E-02 0.0000E+00 5.9101E-03 -3.4023E-03 -2.4265E-02 1.6298E-03
5- 16 elastic -2.3065E-01 -3.2565E-02 0.0000E+00 6.0890E-02 -3.4023E-03 -2.4265E-02 1.3029E-03
6- 16 elastic -3.0923E-01 -3.0984E-02 0.0000E+00 9.0408E-02 -3.4023E-03 -2.4265E-02 5.3680E-03
7- 16 elastic -3.3606E-01 -2.5992E-02 0.0000E+00 1.0568E-01 -3.4023E-03 -2.4265E-02 9.3878E-03
The only difference is that in this output we have 16 instead of 2 in fornt of the numerbs 1 to 7.
Please suggest me the correction.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
这可能对您有用:
编辑:
参考下面的评论和修正问题中显示的请求输出,这里是修正的解决方案:
This might work for you:
EDIT:
With reference to comments below and requested output shown in amended question, here is an amended solution:
这是解决方案:使用 Unix 排序对科学数字进行排序
所以用这个:
here's solution: Sorting Scientific Number With Unix Sort
so use this:
分成多行:(
>
是 bash 提示符):结果:
解释:
NR<4{next}
跳过前 3 行NF==2{id=$1}
跟踪当前组 IDNF==10{printf...$10}
< /strong> 打印 id 和值column#10sort -k1,1 -k2,2n
按column#1 和column#2 排序awk 'x!=$1... print}
在打印当前组的第一行之前打印最后一组的最后一行{y=$0}
跟踪最后一行END{print}
打印最后一行Break into multi-lines: (
>
is bash prompt):Result:
Explanation:
NR<4{next}
skip first 3 linesNF==2{id=$1}
keep track of current group idNF==10{printf...$10}
print both id and value of column#10sort -k1,1 -k2,2n
sort by column#1 and column#2awk 'x!=$1...print}
print last group's last line before print current group's first line{y=$0}
keep track of last lineEND{print}
print last linerrr...无法在注释中插入代码块=(
如果我没理解错的话,您需要第一列中的数字,它们对应于最小值和最小值。第 10 列的最大值,对吧?您可以使用以下脚本:
rrr... can't insert code block in comment =(
if i undestood you right, you need numbers from first column, which correspond to minimum & maximum values from 10th column, right? Than you can use following script:
输出
该脚本是一个独立的概念验证测试套件。对于实际使用,我建议删除以下两个代码“块”,并在工作脚本文件中仅保留 3 个 awks。
猫...>> testMin...EOD
块将示例数据创建到测试文件中。if ${testingMode:-true}...
块使用set -- arg1 arg2 ...
的 shell 功能来设置位置参数。然后,该值将扩展为 shell 参数“${@}”,您可以在第一个 awk 程序末尾看到该参数(就在管道字符 ('|') 之前)。我还在
"${@?Usage:$0 file1 [file2 ...]}"
的计算中嵌入了一个用法语句。如果未提供文件名,脚本会向您提供简单的错误/使用消息。我保留了调试语句,您可以删除前面的“#”字符来查看数据在脚本中的处理方式。
请注意 awk 关联数组
hdrs[hd]=++i ; hdrsVal[i]=hd;
等对于 awk 新用户来说并不总是直观明显的。但是 awk 关联数组是该语言最强大的功能之一。它们绝对值得您花时间尝试以了解它们的工作原理。打开一些调试行以查看哪些值在何处排序。我保留 arr
hdrs[hd]
的唯一原因是在最后,我们可以通过数字键(1,2,3,...)枚举数组,这意味着数据将是按照读取的顺序打印,并使用 hdrs[2]=1346995-25 返回的值,然后我们可以通过 min[1346995-25] 查找最小值和最大值,最大值[1346995-25]。最后,当您的数据看起来是工程数据时,您可能会通过查看以下链接找到进一步的帮助: awk.info--Engineering< /a>
编辑
我已使用 setID 将最终蒸馏添加到仅 1 分钟和最大值。
你写的
当您按照我上面提到的方式编辑脚本时,您需要保存文件。
然后,您需要从 Unix/Linux/Cygwin 命令行“标记”该文件,以便操作系统知道它是可执行的。
现在,您可以像这样执行 cmd
这是在 Unix 中创建输出文件的标准方法。参数处理将收取咨询费;-)
我上面提到了 awk.info。由于您是一名机械工程师,请务必查看
这也指向另一个网站,由机械工程师完成。
我在这里使用的设计是传统的 Unix 管道。 awk 的每个部分都解决了难题的一部分。您可以断开任何部分(通过插入 2 个空行并添加
exit
来查看脚本的每个阶段正在执行的操作。有关使用 awk 的更多一般信息,请参阅此 Grymoire 最优秀的 Awk 教程
我希望这会有所帮助。
output
This script is a self-contained proof-of-concept test suite. For real usage, I would recommend deleting both of the following 'blocks' of code, and leave only the 3 awks in your working script file.
The
cat ... > testMin...EOD
block creates your sample data into a test file.The
if ${testingMode:-true}...
block uses the shell feature ofset -- arg1 arg2 ...
to set positional parameters. This value is then expanded as the shell parameter "${@}" that you see at the end of the first awk program (just before the pipe char ('|')).I have also embedded a usage statment into the evalution of
"${@?Usage:$0 file1 [file2 ...]}"
. If no filenames are supplied, the script gives you a simple error/usage message.I have left the debugging statements in, you can remove the '#' char in front to see how data is being processed as it goes through the script.
Note that awk associative arrays
hdrs[hd]=++i ; hdrsVal[i]=hd;
etc., are not always intuitvely obvious to the new awk user. BUT awk associative arrays are one of the languages most powerful features. They are definitely worth your time experimenting with to understand how they work. Turn on some of the debugging lines to see what values are getting sorted where.The only reason I keep the arr
hdrs[hd]
is so at the end, we can enumerate through the array by numeric key (1,2,3,...) which means the data will be printed in the order it was read in, and by using the value returned byhdrs[2]=1346995-25
, then we can lookup min and max values via min[1346995-25], max[1346995-25].Finally, as you data looks to be engineering data, you may find further help looking at the links at awk.info--Engineering
Edits
I have added the final distilation to just 1 min and max value with the setID.
You wrote
When you edit script as I have mentioned above, you need to save the file.
Then from the Unix/Linux/Cygwin cmd-line, you need to 'mark' the file so the O.S. knows it is meant to be executable.
Now, you can execute the cmd like
This is the standard way of creating output files in Unix. Argument processing will be a consulting fee ;-)
I mentioned awk.info above. As you're a mechanical engineer, be sure to check out
This also points to another website, done by a mechanical engineer
The design I'm using here is a traditional Unix pipeline. Each awk section solves one part of the puzzle. You can disconnect any section (by inserting 2 blank lines and adding
exit
to see what each stage of the script is doing.For more general info on using awk, see this the Grymoire's most Excellent Awk Tutorial
I hope this helps.