当我这样做时:
LINE=$(head -38 fine.txt | tail -1 | cut -f2)
我得到文件的第38行,即:
Xres = 1098
但我只需要记录1098作为变量的值。
我正在训练读取文本文件并记录值,并在我的脚本中稍后将它们用作参数。
答案 0 :(得分:0)
将| awk '{print $3}'
添加到管道中。
答案 1 :(得分:0)
sed -n '38s/.*= *//p' fine.txt
默认情况下,sed
会打印每个输入行。 -n
选项禁用此行为。 38
选择第38行,当看到这一行时,替换将所有内容替换为最后一个等号,并打印。
假设第二个字段是最后一个字段。如果输入行比我假设的更复杂,请尝试替换s/^[^\t]*\t[^\t]*= *//p
。如果您的sed
无法将\t
识别为制表符,则需要提供文字制表符(您可以在某些shell中输入一个带有键序列ctrl-v标签的制表符。)
如果输入文件很大,您可能需要重构sed
脚本以在第38行之后退出。
结束,这让我们
LINE=$(sed -n '38!b;s/^[^\t]*\t[^\t]*= *//p;q' fine.txt)
然而,这变得有些复杂,以至于妨碍了易读性和可维护性。 Awk中的相同内容更具可读性;
awk -F '\t' 'NR==38 { sub(/.*= */,"",$2); print $2; exit 0 }' fine.txt
更一般地说,您可能希望拆分选项卡,然后拆分空格。以下更准确地实现了cut -f2 | awk '{ print $3 }'
:
awk -F '\t' 'NR==38 { split($2,f); print f[3]; exit 0 }' fine.txt
选项-F '\t'
将标签设置为输入字段分隔符。条件NR==38
选择第38行,split($2,f)
将空格中第二个以制表符分隔的字段拆分为数组f
。然后我们只打印f
的第三个元素和exit
。