我有一个类似下面的文件:
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
答案 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行)并且为了简单使用,我可以避免使用awk。对我来说这似乎有点矫枉过正。它可以在纯bash中轻松解决。
我假设每个输入文件行中只有一个':',并且没有空格。如果确实如此,解决方案非常简单(仅使用内置命令,因此不需要昂贵的fork
和exec
调用):
out=($(<file1.txt)); out=${out[@]#*:}
结果位于out
变量中,如果您想对bash内的结果执行某些操作,则该结果非常方便。 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}
我希望这有点帮助!