Chinaunix

标题: shell 脚本求助 ,循环处理大量文件 [打印本页]

作者: hanhuanhuan    时间: 2014-03-21 12:29
标题: shell 脚本求助 ,循环处理大量文件
大家好,现在想用脚本处理test 目录下大量(10000多)文件,对每个文件的处理是相同的,先是删除前九行,然后对每个文件的第二列进行赋值,接着提取文件前四列,不知道这个循环怎么写。急需处理大量数据,求助
作者: q1208c    时间: 2014-03-21 13:11
我不是太明白这个问题的难度在哪里?
是不会取目录(test)下的文件呢?
还是不会写删除前9行?

作者: yestreenstars    时间: 2014-03-21 13:13
猜的:
  1. awk 'NR>9{$2="xxoo";NF=4;print}' test/*
复制代码

作者: love_shift    时间: 2014-03-21 15:04
回复 3# yestreenstars
  赋值!

   
作者: reyleon    时间: 2014-03-21 15:06
貌似没啥难度!目测论坛里的大神,很少对没有数据的帖子感兴趣
作者: yestreenstars    时间: 2014-03-21 15:39
回复 4# love_shift

没搞懂他的赋值是啥意思,所以随便乱写了~
   
作者: hanhuanhuan    时间: 2014-03-22 11:25
回复 2# q1208c
对大神们来说肯定是不难的啥,我是shell脚本小白,现在在啃这一部分知识,有点慢。我知道用find找到目录下的文件然后用sed删除了1-9行,接着用awk给每个文件第二列符合条件的数值赋值(改成其他的值),但是不知道用循环(for或是其他的)怎么写,因为要把每次处理的文件输出来,接下还有其他的用处。所以在帖子上请教了,呵呵呵,还望多指教,是急着用这些数据,不过以后还是要把 linux shell好好学学。


   
作者: hanhuanhuan    时间: 2014-03-22 11:38
回复 3# yestreenstars
你好,首先先谢谢你啦。我的问题可能写的不太清楚。就是在test目录下有很多文件(数目不清楚),想先find这些文件(后缀都相同,.lammpstrj),然后删除每个文件前九行,接着对每个文件第二列符合条件的数值进行赋值(换成其他的数,比如第二列为1,则换成1.27,否则换成1.6)。每个文件都是这样的处理。想用循环做,因为接下来我还有其他的处理。不知道这个循环语句怎么写。对单个文件的操作我知道怎么弄,但是怎么循环,读取这些文件,再一个个处理后输出与原文件相同前缀的文件(比如原文件是0001.lammmpstrj,处理后输出成0001.txt文件)。在linux shell上还在学习。谢大神赐教。


   
作者: q1208c    时间: 2014-03-22 13:56
回复 7# hanhuanhuan
  1. function process ()
  2. {
  3.     echo "##$1##"
  4. }
  5. for my_file in `find $1 -type f`
  6. do
  7.      process $my_file
  8. done
复制代码
你这手也太新了.
作者: hanhuanhuan    时间: 2014-03-22 22:50
回复 9# q1208c




恩恩,还请多指教。先谢谢啦。帮我看看下面这个脚本,就测试了4个文件,老长时间都不出来结果,不知道什么原因。
#!/bin/bash
for i in ` find file -type f -name "*.lammpstrj" `
do
a=`sed -i '1,9d' $i`
cat $a | while read line
  do
 echo $line | awk '{if ($2=="1" print $1 ,$3 ,$4 ,$5 ,$6="1.27" ; else print $1 ,$3 ,$4 ,$5 ,$6="158"}'
  done
done
   
作者: yestreenstars    时间: 2014-03-23 00:27
回复 8# hanhuanhuan

你能给个具体的例子来说明一下么?我看了你的主题,又看了你的回复,感觉很矛盾,比如,你主题说:
先是删除前九行,然后对每个文件的第二列进行赋值,接着提取文件前四列

你说你要提取的是文件的前四列,但你在10楼的脚本中却是这样写的:
print $1 ,$3 ,$4 ,$5 ,$6="1.27"

你在8楼的回复中是这样写的:
比如原文件是0001.lammmpstrj,处理后输出成0001.txt文件

我的理解是不修改源文件,把修改后的结果重定向到前缀相同的txt文件,但从你10楼的脚本来看你却修改了源文件:
sed -i '1,9d' $i

看得我头都晕了~

我建议你按照我下面的格式举个例子:

处理前的.lammpstrj文件的内容:
XXX

处理后的.lammpstrj文件的内容:
XXX

根据.lammpstrj得到的.txt文件的内容:
XXX

   
作者: hanhuanhuan    时间: 2014-03-23 11:52
回复 11# yestreenstars
                                                     
谢谢你的回复。我就是想把处理前的文件里前九行描述性的去掉(我用sed在原文件上删除了 ),然后再根据文件中第二列的值(如果是1,$6赋值为1.27,否则赋值1.58),其实我就是提取了原子id以及原子的坐标,加上$6的赋值那一列。

   

处理前.pdf

21.25 KB, 下载次数: 6

处理前.pdf

21.25 KB, 下载次数: 6


作者: hanhuanhuan    时间: 2014-03-23 11:53
回复 12# hanhuanhuan


   

处理后.pdf

13.84 KB, 下载次数: 7


作者: yestreenstars    时间: 2014-03-23 12:33
回复 12# hanhuanhuan

你直接把文本贴到回复里吧,不要用附件,就算用你也别用PDF啊,用TXT不行吗?
   
作者: yxl_ht    时间: 2014-03-23 13:43
三楼回复的多好啊,循环一加,判断加上就能用了啊
作者: hanhuanhuan    时间: 2014-03-23 20:43
回复 14# yestreenstars


处理前:
   
ITEM: TIMESTEP
1236000
ITEM: NUMBER OF ATOMS
16000
ITEM: BOX BOUNDS pp pp ss
-6.7918 6.7918
-6.94724 6.94724
-732.802 734.56
ITEM: ATOMS id type x y z c_5 c_6
176 1 -5.82881 -6.53303 -731.446 -2.42114 0.136341
1106 1 -5.97314 -3.6675 -698.105 -2.79397 0.0938119
1564 1 -2.26312 -4.02711 -731.233 -2.34784 0.311021
634 1 -3.14313 -2.23052 -729.546 -2.88232 0.0540038
982 1 -0.694826 -6.39106 -727.128 -3.27515 0.356942
599 1 -3.6459 -5.92627 -729.823 -2.86464 0.132928
2917 2 -2.5816 -4.36907 -727.462 -6.02845 0.297569
1783 2 -5.66376 -4.47462 -728.803 -5.59957 0.101155
2572 1 -1.59191 -2.13556 -727.987 -2.81018 0.10121
8704 1 -6.19179 -0.552736 -369.505 -2.92728 0.151246
1973 1 -2.6704 -0.0161747 -707.155 -3.16277 0.177424
2434 1 -0.351478 -3.02733 -369.567 -2.8353 0.0386969
1031 2 -0.435456 -1.80943 -730.288 -5.32585 0.162662
2389 1 -3.12658 -0.0973931 -728.272 -2.93912 0.251039

处理后:
176  -5.82881 -6.53303 -731.446  1.27
1106  -5.97314 -3.6675 -698.105 1.27
1564  -2.26312 -4.02711 -731.233  1.27
634  -3.14313 -2.23052 -729.546  1.27
982  -0.694826 -6.39106 -727.128 1.27
599  -3.6459 -5.92627 -729.823  1.27
2917  -2.5816 -4.36907 -727.462  1.58
1783  -5.66376 -4.47462 -728.803  1.58
2572  -1.59191 -2.13556 -727.987 1.27
8704  -6.19179 -0.552736 -369.505 1.27
1973  -2.6704 -0.0161747 -707.155  1.27
2434  -0.351478 -3.02733 -369.567  1.27
1031  -0.435456 -1.80943 -730.288  1.58
2389  -3.12658 -0.0973931 -728.272  1.27



作者: q1208c    时间: 2014-03-24 07:10
回复 10# hanhuanhuan


    #!/bin/bash
for i in ` find file -type f -name "*.lammpstrj" `
do
a=`sed -i '1,9d' $i`
cat $a | while read line
  do
echo $line | awk '{if ($2=="1" print $1 ,$3 ,$4 ,$5 ,$6="1.27" ; else print $1 ,$3 ,$4 ,$5 ,$6="158"}'
  done
done


sed -i 的结果是 "" 的, 所以, 你的 $a 就是个 "", 那下面的while 在等你的输入, 因为你用了 read.

当然不会有结果了.
作者: yestreenstars    时间: 2014-03-24 10:52
回复 16# hanhuanhuan

这样不就好多了吗?一对比就知道你的需求了,比你说一大堆有用。

try:
  1. #!/bin/bash
  2. while read file
  3. do
  4.         awk 'NR>9{print $1,$3,$4,$5,$2==1?"1.27":"1.58"}' "$file" > "${file%.*}.txt"
  5. done <"$(find test -type f -name '*.lammpstrj')"
复制代码

作者: hanhuanhuan    时间: 2014-03-24 12:58
回复 18# yestreenstars
恩恩,是的,第一次在这里发帖求助,不懂规矩, 。谢谢你啦


   
作者: hanhuanhuan    时间: 2014-03-24 12:59
回复 17# q1208c
恩恩,查了下用法,是有问题。谢谢你,

   
作者: hanhuanhuan    时间: 2014-03-24 13:24
回复 18# yestreenstars
试了下后出现了这样的提示,不知道这是什么意思,(就把test目录改成了file,试了4个lammstrj文件)
line 5: file/dump_300_stress.3516400.lammpstrj
file/dump_300_stress.3516100.lammpstrj
file/dump_300_stress.3516300.lammpstrj
file/dump_300_stress.3516200.lammpstrj: 娌℃.?d釜?.欢?..褰


   
作者: yestreenstars    时间: 2014-03-24 14:33
回复 21# hanhuanhuan

这提示我也看不懂~
   
作者: hanhuanhuan    时间: 2014-03-24 16:21
回复 22# yestreenstars

已经解决,谢谢


   
作者: yestreenstars    时间: 2014-03-24 16:27
回复 23# hanhuanhuan

是啥问题呢?
   
作者: haokoo    时间: 2014-03-25 16:46
回复 24# yestreenstars


    根据乱码信息,提示内容应该是: No such file or directory
作者: haokoo    时间: 2014-03-25 16:53
本帖最后由 haokoo 于 2014-03-25 16:53 编辑
  1.     #!/bin/bash
  2.     while read file
  3.     do
  4.             awk 'NR>9{print $1,$3,$4,$5,$2==1?"1.27":"1.58"}' "$file" > "${file%.*}.txt"
  5.     done << EOF
  6. `find test -type f -name '*.lammpstrj'`
  7. EOF
复制代码
改成这样就不会有“No such file or directory”的提示。
为什么?




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2