1

我有一个用 tcsh 编写的脚本。

#!/bin/tcsh -f

set sublen = `echo $1 | wc -c`
@ sublen = $sublen + 10
echo Grades for $1
echo =================
grep -wr --include=?????????.std $1 * | cut -d " " -f 2 | sort -rn

输出如下所示:

Grades for <$1>
=================
<arbitrary 2nd field>
<arbitrary 2nd field>
<arbitrary 2nd field>

但是我希望它还在每个排序行之前输出文件名(减去“.std”)。所以它看起来更像这样:

Grades for <$1>
=================
111111111    <arbitrary 2nd field>
222222222    <arbitrary 2nd field>
333333333    <arbitrary 2nd field>

我一直在尝试使用分成两部分的脚本,一个用于使用循环打印行,另一个用于对它们进行排序,但是只要参数与文件中的任何行都不匹配,就会导致错误。

4

1 回答 1

2

是时候进行两步恢复计划了:

  1. 忏悔你的邪恶方式——或者,至少,放弃尝试在 C shell 中编写脚本的异端邪说(参见Csh Programming Considered Harmful)。

  2. 不要删减您需要的信息:

    grep -wr --include=?????????.std $1 * | sed 's/\.std:/ /' | sort -k 2rn
    

    sed命令.std从文件名和grep添加的冒号中删除,将其替换为空格以将基本文件名与值分开。该sort命令以相反的数字顺序对第二个字段进行排序,就像您之前以相反的数字顺序对第一个(唯一)字段进行排序一样。

由于脚本的正确操作取决于包含的文件名grep,并且grep当您只指定一个要扫描的文件时,默认情况下不包含文件名,因此可能值得使用:

    grep -wr --include=?????????.std $1 /dev/null * | sed 's/\.std:/ /' | sort -k 2rn

添加/dev/null可确保命令行上始终至少有两个文件名,因此您始终可以通过 获得文件名输出grep,但不会从/dev/null. 某些版本grep有一个选项来指定“始终输出文件名”,Mac OS X 上的一个这样的选项是-H. 检查您的手册页grep

于 2013-07-07T15:55:17.770 回答