我想提取文本文件最后一行的第一列。而不是在另一个文件中输出感兴趣的内容并再次读取它,我可以直接使用一些命令将其读入变量吗? 例如,如果我的文件是这样的:
...
123 456 789(this is the last line)
我想要的是在我的shell脚本中将123读入变量。我怎么能这样做?
答案 0 :(得分:1)
一种方法是提取所需的行,将其列读入数组,然后发出所需的数组元素。
最后一行:
#!/bin/bash
# ^^^^- not /bin/sh, to enable arrays and process substitution
read -r -a columns < <(tail -n 1 "$filename") # put last line's columns into an array
echo "${columns[0]}" # emit the first column
或者,awk
是适合该工作的工具:
line=2
column=1
var=$(awk -v line="$line" -v col="$column" 'NR == line { print $col }' <"$filename")
echo "Extracted the value: $var"
也就是说,如果你正在寻找一个接近文件开头的行,它通常更快(在运行时性能意义上)并且更容易坚持shell内置。例如,要获取文件第二行的第三列:
{
read -r _ # throw away first line
read -r _ _ value _ # extract third value of second line
} <"$filename"
这可以通过使用_
s作为您不想阅读的值的占位符来实现。
答案 1 :(得分:0)
我想用&#34;第一列&#34;,你的意思是&#34;第一个字&#34;,对吗?
如果有保证,最后一行不以空格开头,你可以这样做
tail -n 1 YOUR_FILE | cut -d ' ' -f 1
答案 2 :(得分:0)
你也可以使用sed:
$> var=$(sed -nr '$s/(^[^ ]*).*/\1/p' "file.txt")
-nr
告诉sed
默认情况下不输出数据(-n
)并使用扩展正则表达式(-r
以避免需要转义副词,否则你必须写\( \))
)。 $
是指定最后一行的地址。正则表达式使用第一个^
锚定行的开头,然后匹配不空格[^ ]*
的所有内容,并将结果放入捕获组{{1然后通过用捕获组( )
替换该行来删除行.*
的其余部分,然后打印\1
以打印该行。