【问题标题】:How to exclude rows from a text file for loop如何从文本文件中排除行进行循环
【发布时间】:2015-01-08 02:28:13
【问题描述】:

我有一个包含多行数据的文本文件 (file1.txt)。 我用来将数据从目录 A 复制到另一个 B 的这个文本文件。我的脚本查看表达式是否包含在存储在 A 中的文件的文件名中。 在目录 A 中,我 grep 另一个文本文件 (file2.txt) 以获取我想在脚本中排除的信息(行如 [bla][0-9][0-9][bla][0-9][0-9])。

set x = `grep '[bla][0-9][0-9][bla][0-9][0-9]' file1.txt`

foreach i ( $x )
    cp A/*$i* B/.
end

例如 file1.txt 中的行:

bla11bla11
bla12bla12
bla13bla13
bla14bla14
bla15bla15

和 grep 来自 file2.txt 的结果,必须为循环排除

bla11bla11
bla12bla12

我的脚本最终应该只使用以下几行

bla13bla13
bla14bla14
bla15bla15

我该怎么做?

【问题讨论】:

  • 你从哪里得到的语法?
  • 这似乎是csh 语法(或类似的语法)。
  • 更改标签是个好主意吗? Stefan,你能澄清一下你在哪个 shell 中工作吗?
  • 这是一个 C-shell 脚本
  • 将第一行设为/bin/csh -vx 以查看正在执行的内容和时间。这将向您显示在执行每一行代码时每个变量使用了哪些值。祝你好运。

标签: loops unix foreach csh


【解决方案1】:

一个简单的嵌套循环完全在 csh 中完成:

#!/bin/csh -f

set f = `grep 'bla[0-9][0-9]bla[0-9][0-9]' file1.txt`
set x = `grep 'bla[0-9][0-9]bla[0-9][0-9]' file2.txt`

echo "Files: $f"
echo "To be excluded from Files: $x"

set r = ( )
foreach i ( $f )
  set skip = 0
  foreach j ( $x )
    if ("$i" == "$j") then
      set skip = 1
      break
    endif
  end
  if ($skip == 0) set r = ($r $i)
end

echo "Result: $r"

在上述示例文件上运行时的输出:

Files: bla11bla11 bla12bla12 bla13bla13 bla14bla14 bla15bla15
To be excluded from Files: bla11bla11 bla12bla12
Result: bla13bla13 bla14bla14 bla15bla15

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-20
    • 2016-07-20
    • 2023-01-08
    • 2019-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多