如何使用shell脚本读取一个文件并写入另一个文件



我有一个文件,它看起来像这样(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.txt0或grep返回非零(例如,文件为空或不存在包含非空白的行(;通过";已写入。无论哪种方式,输出都会重定向到file2.txt

这意味着file1.txt为空

然后我将按照的方式利用GNUAWK来完成这项任务

awk 'END{print NR?$0:"Passed"}' file1.txt > file2.txt

说明:我使用所谓的三元运算符条件?valueiftrue:valueiffalse作为条件,我只使用NR(数字行(,其中END内是处理的总行数,如果file1.txt有一行或多行Iprintfile1.txt0,其中END内是文件的最后一行,否则,即文件I中有0行的print文本Passed

(在gawk 4.2.1中测试(

使用任何awk:

awk '{print} END{if (!NR) print "Passed"}' file1.txt > file2.txt

相关内容

  • 没有找到相关文章

最新更新