【问题标题】:Add a condtion for specfic row length in a script在脚本中添加特定行长的条件
【发布时间】:2021-08-31 12:42:55
【问题描述】:

我要修改以下脚本:

awk 'NR>242 && $1 =='$t' {print $4, "\t" '$t'}' test.txt > file

我想为前“1 到 121”数据(对应前 121 个点)添加条件,然后为“122 到 242”数据(对应其他 121 个点)添加条件。

这样就变成了:

当 NR>242 取 1 到 121 行的对应值时,将它们打印到 file1

当 NR>242 取 121 到 242 行的对应值时,将它们打印到 file2

谢谢!

【问题讨论】:

  • 当您读取第 243 行(因此第一行 NR > 242)时,您将无法再访问第 1 行(除非您已存储它)。当您的意思是“列”时,您使用的是“行”这个词吗?
  • 数据文件先存储点,再存储条件语句中所有点的对应数据,如下:当NR>242 && NR为1到121时,取对应的值当 NR>242 && NR 从 121 到 242 时,从第 4 列将它们打印到 file1,从第 4 列获取相应的值并将它们打印到 file2 我希望现在更清楚,事情是每 242 行在行号之后242与具体时间步长相关联,分为1到121和121到242两个区域,再次感谢。
  • "当 NR > 242 && NR 从 1 到 121"。那是什么意思?如果 NR > 242,则 NR 不在 1 和 121 之间。您的意思是“NR > 242 && 0
  • @HusseinKokash,恕我直言,尽管从代码方面进行了解释(您确实展示了您的努力),但您可以在您的问题中发布输入样本和预期的 ouytout。保持示例简单而简短,以便我们可以在其中测试我们的代码,谢谢。
  • 如果我的陈述误导了威廉,我很抱歉,我的意思是在第 242 行之后我有 242 个数据(行),它们被分组为:第一个 121 个数据应该转到 file1 和最后 121 个数据应该转到 file2,因此如果我想让它不那么混乱,那么计数从第 243 行开始,直到 484。这就是为什么我想说如果 NR > 242 我希望前 121 行转到 file1,最后 121 行转到 file2 再次感谢并原谅我缺乏经验

标签: if-statement awk rows multiple-conditions


【解决方案1】:

通用解决方案:在此处添加更多通用解决方案,您可以在其中提供lines 程序的lines 变量内的所有行号。一旦行号与值匹配,它将增加文件的计数器 1 例如:从文件 1 到文件 2 或文件 2 到文件 3 等等...

awk -v val="$t" -v lines="121,242" -v count=1'
BEGIN{
num=split(lines,arr,",")
for(i=1;i<=num;i++){
  line[arr[i]]
  outputfile="file"count
}
}
FNR in arr[i]{
  close(outputfile)
  outputfile="file"++count
}
($1 == val){
  print $4 "\t" val > (outputfile)
}
' Input_file


使用您展示的示例,请尝试以下操作。这将从第 1 行到第 242 行的所有行打印到文件 1,从第 243 行开始打印输出到文件 2。程序还有一个名为t 的shell 变量传递到awk 程序的名为val 的变量。

awk -v val="$t" '
FNR==1{
  outputfile="file1"
}
FNR==243{
  outputfile="file2"
}
($1 == val){
  print $4 "\t" val > (outputfile)
}
' Input_file

【讨论】:

  • 非常感谢您的宝贵意见。条件语句如下:当NR>242 && NR为1~121时,取第4列对应的值,打印到file1;当NR>242 && NR为121~242时,取对应的值从第4列打印到file2我希望现在更清楚了,事情是第242行之后的每242行都与特定的时间步相关联,并分为两个区域,1到121和121到242。再次感谢,感谢您的帮助
  • @HusseinKokash,这就是我的回答应该做的。如果行大于 242 并且第一列等于您的 shell 变量,那么它会将该行打印到 file2。测试我的代码后告诉我
  • @HusseinKokash,请尝试我的通用解决方案一次(阅读它的所有描述;它的工作原理;答案本身给出的解释),让我知道它是怎么回事,干杯。
【解决方案2】:
$ awk -v val="$t" '{c=int((NR-1)%242/121)+1}
           $1==val {print $4 "\t" $1 > (output"c")}' file

如果满足条件,这应该将 121 条记录的第一个、第三个等块输出到 output1,并将 121 个记录的第二个、第四个等块输出到 output2。

如果您想跳过前两个块(前 242 条记录),只需将 &amp;&amp; NR&gt;242 条件添加到现有块即可。

【讨论】:

  • 你好 Karakfa,我有一个文本文件,其中前 242 行是点坐标,121 行,另外 121 行,第 242 行之后是结果,每次都有 242结果,第一行是 121,另一行是下一个 121,我写的代码只有 121 个点(一行),在第 121 行之后,每次都有 121 个结果,现在我又添加了 121 个点,他们反映在结果上,我想修改该行,以便每次将前 121 行(第 242 行之后)放到一个文件中,然后每次将下 121 行放到另一个文件中
  • 您是否尝试了上述修改的脚本?不是你指定的吗?
  • 没有!还是谢谢
猜你喜欢
  • 1970-01-01
  • 2015-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-22
  • 2019-08-25
  • 1970-01-01
相关资源
最近更新 更多