使用|的dos / unix编程命令初学者的问题

时间:2010-08-08 12:01:18

标签: unix batch-file

我正在尝试执行以下操作:

  1. 获取文件的最后一行:tail -n 1 test.csv

  2. 如果最后一行是END,那么继续(第3点),否则退出

  3. 获取文件中的行数:wc -l test.csv

  4. 将这些行放在没有最后一行的新文件中:head -n(length -1)test.csv> testdone.csv

  5. (或者如果可能只从文件中删除此行)

    有人可以给我一个关于如何做到这一点的完整脚本吗?

    非常感谢你,现在正在寻找/尝试几个小时!

4 个答案:

答案 0 :(得分:1)

在unix / linux上尝试(在脚本文件中):

#!/usr/bin/env bash
# 1
lastline=`tail -n 1 test.csv`

# 2
if [ "$lastline" == "END" ]; then
  exit
fi

# 3  (actually not needed)
num_lines=`wc -l < test.csv`

# 4 copy all except last line
sed \$d < test.csv > testdone.csv

答案 1 :(得分:0)

获取文件的最后一行:tail -n 1 test.csv。这样可行。你有什么问题?

  

如果最后一行是END然后继续(第3点),否则退出

这没有任何意义,因为“文件的最后一行”是最后一行。结束。没有更多的行。

获取文件中的行数:wc -l test.csv。这样可行。你有什么问题?

将这些行放在没有最后一行的新文件中:head -n (length -1) test.csv > testdone.csv

“这些行”很模糊,但显示的代码看起来很棒。你有什么问题?

答案 2 :(得分:0)

尝试这样的事情。

#! /usr/bin/env sh

FILENAME="input.csv"
OUT="output.csv"

echo "Last line:"`tail -n 1 $FILENAME`
linecount=`wc -l $FILENAME|cut -d " " -f 1`
echo "No of lines:$linecount"
linecount=`expr $linecount - 1`
head -n $linecount $FILENAME > $OUT
echo "Copied to $OUT"

答案 3 :(得分:0)

输入文件的大小是多少?

如果它不是太大(小于5兆字节),那么AWK可以帮助你:

awk'{a [++ i] = $ 0} END {if(a [i]〜/ ^ END $ /){delete a [i]; for(i in a){print a [i]&gt ;&GT; “done-”FILENAME}}}'test.csv