Shell脚本:如果找不到则跳过列

时间:2016-11-07 19:53:38

标签: shell awk

我有太多文件包含这样的一行:

Name: transa= N, transb= N, m= 40600, n= 40600, k= 40600, perf= 1635.266 gf

我需要从所有这些中获取 n和perf 。认为有些文件是空的或有错误。这就是我现在所拥有的:

for file in * 
do
    awk -F "," '{print $(NF-2), $NF}' file1* 2>&1|tee "file1.csv" 
    awk -F "," '{print $(NF-2), $NF}' file2* 2>&1|tee 2>&1|tee "file2.csv"
done 2>&1 | tee "everything.csv"

一旦循环遍历空文件或错误文件,我就会收到错误。请建议如何检查(NF-2)是否存在。

此外,现在我得到了结果:

n= 1000  perf= 1810.386 gf
 n= 10000  perf= 4996.192 gf
 n= 13600  perf= 4870.097 gf
 n= 1600  perf= 2661.830 gf

我如何得到:

1000 1810.386 
10000 4996.192 
...

谢谢

3 个答案:

答案 0 :(得分:1)

也许

from celery import Celery
from django.conf import settings

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'my_app.settings')
app = Celery('my_app', broker=settings.BROKER_URL)

# Using a string here means the worker will not have to
# pickle the object when using Windows.
app.config_from_object('django.conf:settings')
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)

答案 1 :(得分:0)

怎么样:

1;10
4;3
2
1;2;3;4
10;5;1

答案 2 :(得分:0)

你可以这样做:

gawk '/\<n=/ && /\<perf=/ {match($0, /\<n=\s*([[:digit:]]+)/, a); match($0, /\<perf=\s*([[:digit:]]+)/, b); printf "%s %s\n", a[1], b[1]}' * > output

不需要bash循环。

请注意,这是gawk特定的,因为字边界为\<

说明:

gawk '/\<n=/ && /\<perf=/   # match n= and perf= in a line
   #    ^         ^       only if the n and perf are not the ending of another word

  {match($0, /\<n=\s*([[:digit:]]+)/, a);  # extract n= number
   match($0, /\<perf=\s*([[:digit:]]+)/, b); # extract perf= number
   printf "%s %s\n", a[1], b[1]}'         # print those two numbers

由于它被写为两个独立的匹配,因此n=perf=可以按行的任何顺序排列。