在shell脚本中拆分文件的每一行

时间:2014-10-22 09:05:55

标签: shell unix awk

我有一个类似下面的文件:

AirGO:50
IndiGo:100
SpliceJet:30
JEt:50
SpiceJet:30

我希望输出如下:

50 100 30 50 30

我想尝试如下:

awk -F ":" '{ printf "%d", $2}' file1.txt

我得到的输出就像

50100305030

我怎样才能得到这样的输出?

50 100 30 50 30 

5 个答案:

答案 0 :(得分:4)

我的建议:

$ cut -d: -f2 file1.txt | paste -d' ' -s
50 100 30 50 30

awk

$ awk -F: 'BEGIN{first=1}{printf (first ? "%d" : " %d"), $2; first=0}END{printf "\n"}' file1.txt

答案 1 :(得分:2)

另一种方式

awk -F: '{a=a?a" "$2:$2}END{print a}' file

答案 2 :(得分:1)

在%d之后使用空格,如下所示(这将导致空间结束,这应该没问题,因为我希望这不是问题):

awk -F ":" '{ printf "%d ", $2}' test.txt

答案 3 :(得分:1)

只需在int;)

中的print后添加一些空格即可
awk -F ":" '{ printf "%d ", $2}' file1.txt

答案 4 :(得分:0)

对于小文件(少于100行)并且为了简单使用,我可以避免使用。对我来说这似乎有点矫枉过正。它可以在纯中轻松解决。

我假设每个输入文件行中只有一个':',并且没有空格。如果确实如此,解决方案非常简单(仅使用内置命令,因此不需要昂贵的forkexec调用):

out=($(<file1.txt)); out=${out[@]#*:}

结果位于out变量中,如果您想对内的结果执行某些操作,则该结果非常方便。 echo "'$out'"的结果是'50 100 30 50 30'

正如 Jidder 指出这个版本仍然是fork s(我需要调查一下原因。我认为没有理由)。但我发现了一个稍微长一点,真正无叉(甚至更快)的解决方案。这实际上打印出结果(我假设~不在输入文件中):

read -d"~" -ra out <file1.txt; echo ${out[@]#*:}

如果输入可能包含空格,则解决方案可能是

while read -r x; do out+=" ${x#*:}" done <file1.txt
out=${out:1}

或类似地

while IFS=: read -r x x; do out+=" $x"; done <file1.txt
out=${out:1}

我希望这有点帮助!