2014-09-23 86 views
0

我想从文件读取每行输入,取一个特定的单词(用分隔符分隔)并将其分配给一个变量。从文件中读取每一行输入并分配给一个变量

cat Number 
Number11,Number21,Number31 
Number12,Number22,Number32 
Number13,Number23,Number33 

我用下面的代码:

while 
read LINE 
do 
var1=$(echo $LINE|awk -F, '{ print $1 }') 
echo $var1 
done < Number|awk -F\, '{ print $1 "," $2 }'|head -2 

我所要的输出是:

Number11 
Number12 
Number13 

但我得到的输出:

Number11, 
Number12, 
Number13, 

我得到不需要的逗号(,)。有人能纠正我吗?

回答

3

回答很多次......

while IFS=, read -r n1 n2 n3 
do 
    #echo "=n1:$n1= =n2:$n2= =n3:$n3=" 
    echo "$n1" 
done < Number 
  • 它集IFS(输入字段分隔符)以逗号
  • 读取文件中的行由行
  • assing场(分裂by IFS)纳入变量read的论点

个打印:

Number11 
Number12 
Number13 
+0

而且,由于只需要在第一场,'n3'可以作为'n2'变量将吸收剩余字段中删除。 – 2014-09-24 00:17:10

2
#!/bin/bash 
#read the lines as array with delemiter as ',' 
while IFS=',' read -a line 
do 
    # echo the index zero of the array 
    echo "${line[0]}" 
done < Number 
0

cut也是这种情况下有用:

while read LINE; do 
    var1=$(cut -d ',' -f 1 <<< $LINE) 
    echo $var1 
done < Number 

输出:

Number11 
Number12 
Number13 
+0

虽然'剪切'工作,没有理由使用它,因为'read'可以执行完全相同的场分裂,而不诉诸外部命令。 – chepner 2014-09-23 21:20:34

+0

诚然,这更多的是个人喜好。虽然这很好理解。 – 2014-09-23 21:24:24

0

尝试下面的awk命令:

awk -F"," '{print $1}' Number 

这可以避免不必要的循环来逐行读取文件,因为awk无论如何都会逐行解析文件。使用awk的-F选项来指定分隔符。

既然你希望它是一个变量,试试这个:

for each in `awk -F"," '{print $1}' Number` 
do 
    echo $each 
done 
相关问题