文件a.txt在末尾有两个空行
[yaxin@oishi tmp]$ cat -n a.txt
1 jhasdfj
2
3 sdfjalskdf
4
5
我的脚本是:
[yaxin@oishi tmp]$ cat t.sh
#!/bin/sh
a=`cat a.txt`
a_length=`echo "$a" | awk 'END {print NR}'`
echo "$a"
echo $a_length
[yaxin@oishi tmp]$ sh t.sh
jhasdfj
sdfjalskdf
3
打开调试
[yaxin@oishi tmp]$ sh -x t.sh
++ cat a.txt
+ a='jhasdfj
sdfjalskdf'
++ echo 'jhasdfj
sdfjalskdf'
++ awk 'END {print NR}'
+ a_length=3
+ echo 'jhasdfj
sdfjalskdf'
jhasdfj
sdfjalskdf
+ echo 3
3
cat命令窃取文件末尾的空白行。如何解决这个问题。
答案 0 :(得分:3)
cat
命令不会窃取任何内容。这是命令替换。 man bash
说:
Bash通过执行命令并用命令的标准输出替换命令替换来执行扩展,删除任何尾随换行符。嵌入的换行符不会被删除
如果要将命令的输出存储到变量,可以在命令后添加&& echo .
,存储输出并删除最后的.
。
另外,要计算文件中的行数,通常的方法是运行wc -l
:
wc -l < a.txt
答案 1 :(得分:1)
这里你不需要cat命令,直接使用这样的awk:
awk 'END {print NR}' a.txt
您的问题是将cat的输出存储在shell变量中。即使这样也会给出正确的输出(虽然是UUOC的情况):
cat a.txt | awk 'END {print NR}'
更新:当您尝试执行此操作时:
a=`cat a.txt`
或者其他:
a=$(cat a.txt)
陷阱是进程替换,即反向引用内的命令,或者$()
内的尾随换行符。
您可以使用此技巧来获取存储在shell变量中的尾随换行符:
a=`cat a.txt; echo ';'`
a="${a%;}"
测试变量值:
echo "$a"
printf "%q" "$a"
然后输出也会显示换行符:
jhasdfj
sdfjalskdf
$'jhasdfj\n\nsdfjalskdf\n\n\n'