使用命令的输出作为 tr 的集合

使用命令的输出作为 tr 的集合

对于我的系统编程课程,我应该浏览一段示例文本,并将最常见的单词替换为另一个短语。不幸的是,我只能使用命令

tr
grep
egrep
sed
awk
uniq
wc

以及管道。我已经找到了最常见的单词,并希望在 tr 的 SET1 中使用它,以便我可以用其他短语替换它。为了做到这一点,我想我必须过滤掉与 grep 或 sed 等相关的行/单词。我的问题是如何将其作为 tr 的第一组传递,以便我可以替换该短语。我没有 awk 的经验。

答案1

您很可能不想使用tr这样做,因为tr仅适用于单个字符(或字节):

$ echo abc | tr cab taxi
axt

我建议您查看一下sed,尤其s///是(替代)运算符。

至于将一个程序的输出传递到另一个程序的命令行,关键字是命令替换

(我不会详细说明,因为这是作业......)

答案2

由于这个家庭作业已经过去两周多了,我将给出我的解决方案(用字符串 替换最常见的空格分隔单词FOO!):


#!/usr/bin/awk -f

{
    for (i = 1; i <= NF; ++i)
        if (NR == FNR) {
            if (++c[$i] > c[m])
                m = $i
        } else {
            if ($i == m)
            $i = "FOO!"
        }
}

NR != FNR

awk应使用命令行中两次提到的文件来调用此脚本:

$ ./script.awk file file

该脚本的唯一缺点是包含最常见单词的行上的空格将被压缩为单个空格。


解决上述问题的变体(或者至少表现得更好):


#!/usr/bin/awk -f

NR == FNR {
    for (i = 1; i <= NF; ++i)
        if (++c[$i] > c[m])
            m = $i
}

NR != FNR { gsub(FS m FS, FS "FOO!" FS) print }

相关内容