我有一个文件,它看起来像这样(file1.txt(
258.2222
我必须将这个file1.txt
值写入另一个文件。如果在CCD_ 2中没有值它应该打印为";通过";。
这就是我试过的
for final in $(cat file1.txt);do
if [ "$final" ];then
echo $final > file2.txt
else
echo "Passed" > file2.txt
fi
done
这只适用于1个场景。如果在CCD_ 3中没有值;通过">
预期输出:
如果file1.txt
:中有值
258.2222
如果file1.txt
:中没有值(空(
Passed
有人能帮我弄清楚吗?提前感谢!
注意:我不允许使用通用脚本语言(JavaScript、Python等(。
如果file1.txt
包含某些内容(其文件大小为非零(,则希望该内容进入file2.txt
:
if [ -s file1.txt ]; then
cp file1.txt file2.txt
fi
如果file1.txt
为空(或缺失(,则需要一行Passed
写入file2.txt
:
if [ -s file1.txt ]; then
cp file1.txt file2.txt
else
echo Passed >file2.txt
fi
如果您想避免在file1.txt
丢失的情况下创建file2.txt
:
if [ -s file1.txt ]; then
cp file1.txt file2.txt
elif [ -e file1.txt ]; then
echo Passed >file2.txt
fi
echo
现在仅在-s
测试失败(文件不存在或为空(和-e
测试成功(文件存在(时执行。
在任何情况下,您实际上都不必在循环中从文件中读取数据。
行for final in $(cat file1.txt); do
的值总是有问题。它会混淆空白,通常是个坏主意。有时它有一个位置,但在大多数情况下,有更好的方法来迭代文件的内容。在您的情况下,这会导致一个问题,因为当文件为空时,循环执行次数为零。
我不清楚你是试图以某种方式解析这个值,还是从其他内容中过滤它。如果你只想复制文件的全部内容;通过";如果文件为空,则可以执行以下操作:
if test -s file1.txt; then
cat file1.txt
else
echo Passed
fi > file2.txt
或
if ! grep '[^ ]' file1.txt; then echo Passed; fi > file2.txt
如果file1.txt
存在并且具有一些内容,则第一种情况下的test
命令将成功(返回0(。请注意,这可能只是空白;如果具有非零大小的文件不足以满足您的需要,您可能需要使用第二种解决方案,其中grep
只有在与至少一行具有非空格字符(可能是制表符!(匹配时才成功。(但请注意,这个grep将过滤掉只有空格的行!(。如果file1.txt
0或grep
返回非零(例如,文件为空或不存在包含非空白的行(;通过";已写入。无论哪种方式,输出都会重定向到file2.txt
。
这意味着file1.txt为空
然后我将按照的方式利用GNUAWK
来完成这项任务
awk 'END{print NR?$0:"Passed"}' file1.txt > file2.txt
说明:我使用所谓的三元运算符条件?
valueiftrue:
valueiffalse作为条件,我只使用NR
(数字行(,其中END
内是处理的总行数,如果file1.txt
有一行或多行Iprint
file1.txt
0,其中END
内是文件的最后一行,否则,即文件I中有0行的print
文本Passed
。
(在gawk 4.2.1中测试(
使用任何awk:
awk '{print} END{if (!NR) print "Passed"}' file1.txt > file2.txt