在 tcsh 中逐行循环遍历文件

在 tcsh 中逐行循环遍历文件

这是一个非常相似的问题如何循环遍历文件的行?

我有一个包含行的文件n字段,以空格分隔。我想按行循环遍历该文件,并将字段设置为变量,用于从不同文件调用信息。

例如,我的文件如下所示:

A B C
D E F
H I J
K L M

我想循环遍历每一行并将变量设置为字段:

foreach i ( `cat file ` )
set 1st = $i[1]; set 2nd = $i[2]; set 3rd = $i[3]
end

现在,我的 shell 使用空格来分隔字段,这意味着我无法在每一行中设置 3 个变量。

如果我对echo每个人$i- 我会看到这个:

A
B
C
D
....

我想知道如何通过仅使用新行作为分隔符来控制循环。

这就是我真正想要实现的目标。我想 grep 文件 A 中包含 3 个不同值的行,所有这些值在文件 B 的行中显示为空格分隔的元素。我的计划是循环遍历文件 B 中的每一行,为每个(空格分隔) B 的该行中的元素,然后使用这 3 个元素。然后对 B 的下一行重复此操作。但是我的循环失败了,因为它看不到文件 B 中的行。它只看到所有以空格分隔的元素,无法识别它们分组为 3 个元素的行。我希望这不会令人困惑

答案1

我不知道最初的问题是否传达得足够清楚,但似乎我在 shell 环境中循环遍历文本文件的行时遇到问题,其中行具有空格分隔的元素,例如

row 1: A B C
row 2: D E F

我找到了一种解决方法,通过将每一行转换为一个元素,以某种方式我可以稍后解析它以超出(我认为)这个问题的范围。所以我上面的两行变成

row 1: A_B_C
row 2: D_E_F

在这种格式中,我的 foreach 循环将每一行视为单个元素,如果我现在在第一次迭代中需要 B,我可以使用,例如:

foreach i ( `cat <file>` )
foreach? set a = `echo $i | awk -F '_' '{print($2)}'`
foreach? echo $a
foreach? end

这应该回响:

B
E

这将是我的文件每一行中的第二个元素

感谢所有感兴趣的人,如果有更优雅的方法来做到这一点,请告诉我。

答案2

我希望有人能回答这个问题。是否可以?是的。推荐吗?不。但如果你必须这样做,你可以按照这个 stackoverflow 的答案来做到这一点:

https://stackoverflow.com/questions/40926372/how-to-iterate-every-line-from-variable-on-the-basis-of-new-line-character-inste

答案3

csh 的分词功能几乎比 Bourne shell 还要好。在 csh 中,"`cmd`"将 的输出分割cmd成非空行,不进行通配符操作,而`cmd`在空格制表符或换行符上进行分割并进行通配符操作。所以你可以这样做:

set n = 0 noglob
foreach line ( "`cat file`" )
  @ n++
  set field = ( $line )
  echo First field of line $n is $field[1], second is $field[2]
end

当然,要按行和字段进行文本处理,您可以使用类似perlor的东西awk,而不是 shell 循环。

相关内容