这是一个非常相似的问题如何循环遍历文件的行?。
我有一个包含行的文件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 的答案来做到这一点:
答案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
当然,要按行和字段进行文本处理,您可以使用类似perl
or的东西awk
,而不是 shell 循环。