Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 使用awk/sed读取列数_Bash_Sed_Awk - Fatal编程技术网

Bash 使用awk/sed读取列数

Bash 使用awk/sed读取列数,bash,sed,awk,Bash,Sed,Awk,我有以下测试文件 Kmax Event File - Text Format 1 4 1000 65 4121 9426 12312 56 4118 8882 12307 1273 4188 8217 12309 1291 4204 8233 12308 1329 4170 8225 12303 1341 4135 8207 12306 63 4108 8904 12300 60 4106 8897 12307 731 4108 8192 12306 ... ÿÿÿÿÿÿÿÿ

我有以下测试文件

Kmax Event File - Text Format
1 4 1000 
65 4121 9426 12312 
56 4118 8882 12307 
1273 4188 8217 12309 
1291 4204 8233 12308 
1329 4170 8225 12303 
1341 4135 8207 12306 
63 4108 8904 12300 
60 4106 8897 12307 
731 4108 8192 12306 
...
ÿÿÿÿÿÿÿÿ
在这个文件中,我想删除前两行并应用一些数学计算。例如,每列
i
都将是
$i-(i-1)*编号。执行此操作的脚本如下所示

#!/bin/bash

if test $1 ; then
   if [ -f $1.evnt ] ; then
      rm -f $1.dat
      sed -n '2p' $1.evnt | (read v1 v2 v3
      for filename in $1*.evnt ; do
         echo -e "Processing file $filename"
         sed '$d' < $filename > $1_tmp
         sed -i '/Kmax/d' $1_tmp
         sed -i '/^'"$v1"' '"$v2"' /d' $1_tmp
         cat $1_tmp >> $1.dat
      done
      v3=`wc -l $1.dat | awk '{print $1}' `
      echo -e "$v1 $v2 $v3" > .$1.dat
      rm -f $1_tmp)
   else
      echo -e "\a!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
      echo -e "  Event file $1.evnt doesn't exist  !!!!!!"
      echo -e "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
   fi   
else
   echo -e "\a!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
   echo -e "!!!!!  Give name for event files  !!!!!"
   echo -e "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
fi
awk '{print $1, $2-4096, $3-(2*4096), $4-(3*4096)}' $1.dat >$1_Processed.dat
rm -f $1.dat
exit 0
65 25 1234 24
56 22 690 19
1273 92 25 21
1291 108 41 20
1329 74 33 15
1341 39 15 18
63 12 712 12
60 10 705 19
731 12 0 18
./myscript <filename>
在控制台中,我将收到消息
,有4个探测器

最后将生成一个新文件_processed.dat,其中file是awk输入文件的初始名称

它的执行方式如下

#!/bin/bash

if test $1 ; then
   if [ -f $1.evnt ] ; then
      rm -f $1.dat
      sed -n '2p' $1.evnt | (read v1 v2 v3
      for filename in $1*.evnt ; do
         echo -e "Processing file $filename"
         sed '$d' < $filename > $1_tmp
         sed -i '/Kmax/d' $1_tmp
         sed -i '/^'"$v1"' '"$v2"' /d' $1_tmp
         cat $1_tmp >> $1.dat
      done
      v3=`wc -l $1.dat | awk '{print $1}' `
      echo -e "$v1 $v2 $v3" > .$1.dat
      rm -f $1_tmp)
   else
      echo -e "\a!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
      echo -e "  Event file $1.evnt doesn't exist  !!!!!!"
      echo -e "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
   fi   
else
   echo -e "\a!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
   echo -e "!!!!!  Give name for event files  !!!!!"
   echo -e "!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!"
fi
awk '{print $1, $2-4096, $3-(2*4096), $4-(3*4096)}' $1.dat >$1_Processed.dat
rm -f $1.dat
exit 0
65 25 1234 24
56 22 690 19
1273 92 25 21
1291 108 41 20
1329 74 33 15
1341 39 15 18
63 12 712 12
60 10 705 19
731 12 0 18
./myscript <filename>
使用awk

awk 'NR<=2{next}{for (i=1;i<=NF;i++) $i=$i-(i-1)*4096}1' file
awk'NR使用awk

awk 'NR<=2{next}{for (i=1;i<=NF;i++) $i=$i-(i-1)*4096}1' file

awk'NR让我们从这个开始,看看它是否接近您想要做的事情:

$ numdet=$( awk -v num=4096 '
    NR>2 && NF>1 {
        out = FILENAME "_processed.dat"
        for (i=1;i<=NF;i++) {
            $i = $i-(i-1)*num
        }
        nf = NF
        print > out
    }
    END {
        printf "There are %d detectors\n", nf | "cat>&2"
        print nf
    }
    ' file )

There are 4 detectors

$ cat file_processed.dat
65 25 1234 24
56 22 690 19
1273 92 25 21
1291 108 41 20
1329 74 33 15
1341 39 15 18
63 12 712 12
60 10 705 19
731 12 0 18

$ echo "$numdet"
4
$numdet=$(awk-v num=4096'
NR>2&&NF>1{
out=文件名“\u processed.dat”
for(i=1;i等于0)
}
结束{
printf“有%d个探测器\n”,nf |“cat>&2”
打印nf
}
'文件)
有4个探测器
$cat file_processed.dat
65 25 1234 24
56 22 690 19
1273 92 25 21
1291 108 41 20
1329 74 33 15
1341 39 15 18
63 12 712 12
60 10 705 19
731 12 0 18
$echo“$numdet”
4.

是吗?

让我们从这个开始,看看它是否接近您想要做的事情:

$ numdet=$( awk -v num=4096 '
    NR>2 && NF>1 {
        out = FILENAME "_processed.dat"
        for (i=1;i<=NF;i++) {
            $i = $i-(i-1)*num
        }
        nf = NF
        print > out
    }
    END {
        printf "There are %d detectors\n", nf | "cat>&2"
        print nf
    }
    ' file )

There are 4 detectors

$ cat file_processed.dat
65 25 1234 24
56 22 690 19
1273 92 25 21
1291 108 41 20
1329 74 33 15
1341 39 15 18
63 12 712 12
60 10 705 19
731 12 0 18

$ echo "$numdet"
4
$numdet=$(awk-v num=4096'
NR>2&&NF>1{
out=文件名“\u processed.dat”
for(i=1;i等于0)
}
结束{
printf“有%d个探测器\n”,nf |“cat>&2”
打印nf
}
'文件)
有4个探测器
$cat file_processed.dat
65 25 1234 24
56 22 690 19
1273 92 25 21
1291 108 41 20
1329 74 33 15
1341 39 15 18
63 12 712 12
60 10 705 19
731 12 0 18
$echo“$numdet”
4.


是吗?

非常感谢您的回答!我正在尝试打印字段数。我正在使用
END{print“有%d个检测器”,NF}
但是它给了我
有%d个检测器1
。所以我需要正确的字段数和打印方法。@Thanos-使用
printf
,而不是
print
进行格式化输出。非常感谢您的回答!我正在尝试打印字段数。我正在使用
END{print“有%d个检测器”,NF}
但是它给了我
有%d个检测器1
。所以我需要正确的字段数和打印方法。@Thanos-使用
printf
,而不是
print
进行格式化输出。以上所有操作都可以在一个简单的awk脚本中完成。如果您根据您发布的示例输入文件向我们显示您的预期输出,我们可以帮助您。我发布了一个答案,作为您尝试做什么的初步猜测-看一看,让我们知道它是否正确,如果不正确,需要做什么不同。@EdMorton:请检查我编辑的问题!好的,检查我编辑的答案,如果需要做任何不同的事情,请在该答案下面添加注释。以上所有操作都可以在一个br中完成ief,简单的awk脚本。如果您根据您发布的示例输入文件向我们显示您的预期输出,我们可以帮助您。我发布了一个答案,作为您试图做什么的初步猜测-看一看,让我们知道它是否正确,如果不正确,需要做什么不同。@EdMorton:请检查我编辑的问题!好的,检查我编辑的答案和广告d如果需要做任何不同的事情,请在回答下面添加注释。它完成了任务!但是,请让我理解……您将
numdet
设置为一个变量来完成所有这些工作?此外,我正在运行它,并且我得到了
/myscript:line 14:$:command not found
。请注意,要处理的文件在那里!不,awk脚本完成了所有这些工作然后打印数字4,然后将其保存在shall变量
numdet
中。您是否有可能在
$numdet=$(awk…
)中包含前导的
$
?如果是,请不要-
$
是我的提示。啊,我在您的脚本中看到您正在使用旧的
`-
构造来调用命令(例如,
v3=`wc-l$1.dat`
)。这种语法已经被弃用,现在你应该改用
$(…)
(例如,
v3=$(wc-l$1.dat)
)。也许这澄清了我的脚本是如何执行awk命令并将其stdout保存在shell变量
numdet
中的,就像您将
wc
的stdout保存在shell变量
v3
中一样。您是对的!我包括了
$
…愚蠢的我…问题是,
那里的消息…
在外面将文件而不是控制台中。是的,因为您在问题中明确表示希望:
示例输出文件如下…有4个检测器
。如果这不是您真正想要的,则只需删除或编辑执行该操作的明显代码行-
printf“有%d个检测器\n”,nf>out
。如果您不知道如何让脚本执行您想要的操作,请更新您的问题,以澄清您真正希望它执行的操作。它完成了任务!但请让我理解……您将
numdet
设置为一个变量来执行所有这些操作?此外,我正在运行它,并且我得到
/myscript:14行:$:未找到命令。请注意,要处理的文件就在那里!不,awk脚本会执行所有这些操作,然后打印数字4,然后将其保存在变量
numdet
中。您是否有可能将前导的
$
包含在
$numdet中=$(awk…
?如果是这样,请不要-
$
是我的提示。啊,我在您的脚本中看到您正在使用旧的
`…
构造来调用命令(例如
v3=`wc-l$1.dat`
)。这种语法已经被弃用,现在您应该改用
$(…)
(例如
v3=$(wc-l$1.dat)
)。也许这澄清了我的脚本是如何执行awk命令并将其stdout保存在shell变量
numdet
中的,就像您将
wc
的stdout保存在shell变量
v3
中一样。您是对的!我包括了
$
…愚蠢的我…问题是,
那里的消息…
在外面把文件放进去,不要放在控制台里。是的,贝卡