在C shell中对输出进行排序

在C shell中对输出进行排序,shell,csh,tcsh,Shell,Csh,Tcsh,我有一个用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> ================= <arb

我有一个用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>
Grades for <$1>
=================
111111111    <arbitrary 2nd field>
222222222    <arbitrary 2nd field>
333333333    <arbitrary 2nd field>

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

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

=================
111111111
222222222
333333333

我一直在尝试使用分为两部分的脚本,一部分用于使用循环打印行,另一部分用于对行进行排序,但每当参数与文件中的任何行不匹配时,都会导致错误。

是时候让您执行两步恢复程序了:

  • 忏悔你的邪恶行径——或者,至少,放弃试图用C语言编写脚本的异端(请参阅)

  • 不要删掉您需要的信息:

    grep -wr --include=?????????.std $1 * | sed 's/\.std:/ /' | sort -k 2rn
    
    sed
    命令从文件名和
    grep
    添加的冒号中删除
    .std
    ,并将其替换为分隔基本文件名和值的空格。
    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

    ,这真的很有帮助!非常感谢。尽管如此,我确实需要保留cut命令,只需根据当前所做的更改对其进行一点更改即可。我要剪切的字段是grep搜索的模式字段,但在最终输出中不需要它。所以现在代码看起来像:
    grep-wr--include=??????.std$1/dev/null*| sed's/\.std://''cut-d”“-f1,3 | sort-k2rn
    ,现在输出是我需要的:)P.s.我不会使用c shell,除非它是P.s.s.要求的一部分。如果我对这个网站不是那么陌生,我有时会投你的票:),你必须向负责人磕头。然而,作为一个长期目标,我认为使用POSIX shell(
    bash
    ksh
    ,等等)而不是C shell来编写脚本是明智的。如果您只需要从数据中选择信息,那么您仍然需要修改版本的
    cut
    ;从这个答案中获得帮助并产生您所需要的,做得很好。(令人惊讶的是,那些提问的人经常发现答案并没有给出他们所需要的,并抱怨,直到答案被修改成他们所需要的。也许有一种权利过度的感觉。)@JonathanLeffler遗憾的是,有些情况下你必须用csh写作。在我的工作中,有一个脚本可以设置环境变量,但只有csh。我需要这些环境变量来调用脚本中的其他程序,因此我基本上需要使用csh(令人沮丧的是,事先没有人警告我,我先在bash中编写了它,然后不得不转换为csh)。如果大多数发帖子的人都知道csh不好,我也不会感到惊讶,他们只是被迫使用csh。我和一些同事一起工作过,他们没有认识到这一点,需要使用他们的csh环境设置脚本。我通常会执行
    csh
    编写他们的脚本.csh
    ,然后执行bash(或
    执行ksh
    )。您可能可以修改它:
    printf“source-this-script.csh\nexec bash-i\n”>my-script.sh
    后接
    csh./my script.sh
    (或者,如果您确信它能工作,
    exec csh./my script.sh
    )。或者是它的变体。基本上,用
    csh
    替换shell足够长的时间来设置环境,然后再次用shell替换
    csh
    。当然,这对别名不太管用。这是我不使用别名的原因之一,如果我能帮上忙的话。我不喜欢shell的“环境设置”脚本,它用数百个我不知道的函数加载环境,更不用说使用了。