使用cut命令分离2个参数

时间:2015-04-18 18:43:11

标签: unix scripting set cut tcsh

我有一个包含2列的文件。对于每一行,我需要将两个参数插入变量:var1应获取第一个值,var2获取第二个值

输入文件例如:

  38452 d0337358
  38453 d0337357
  38454 d0337363

我使用setcut执行此操作:

foreach f (cat file)
foreach? set var1 = ( echo $f | cut -f1 -d- )
foreach? set var2 = ( echo $f | cut -f2 -d- )
foreach? echo $var1
foreach? end

但是作为输出我得到了:

38452
d0337358
38453
d0337357
38454
d0337363

而不仅仅是第一列的参数。

有人能指出foreach身上的问题吗?或者有人知道更好的方法吗?

2 个答案:

答案 0 :(得分:0)

如果要循环浏览文件并分别读取每一列,可以像这样使用while循环:

while IFS=" " read -r var1 var2
do
   echo "var1=$var1, var2=$var2"
done < file

请注意,您使用的是foreach,这在Bash中不存在。此外,不需要set个变量:只需说var="value"设置它们。

解释

  • IFS=" "将字段分隔符设置为空格。
  • 'read -r var1 var2 sets the first word to the variable $ var1 and the rest to the variable $ var2`。
  • while; do ... done < file是一种处理文件的好方法,它通过间接<提供内容。

测试

$ while IFS=" " read -r var1 var2; do echo "var1=$var1, var2=$var2"; done < a
var1=38452, var2=d0337358
var1=38453, var2=d0337357
var1=38454, var2=d0337363

答案 1 :(得分:0)

问题在于&#34; cat file&#34;读取文件的内容。它使用空格作为分隔符,而不是行尾。

这是一个简单的解决方案,假设输入文件总是有2列:

set n = 1
foreach f ( `cat file` )
    if ( $n % 2 == 1 ) then
        set var1 = $f
    else
        set var2 = $f
        echo $var1
    endif
    @ n++
end