linux - 删除通讯输出中的空格

标签 linux shell awk grep comm

我有两个 ID 列表,正在与 comm 命令进行比较。我的问题是输出如下所示:

YAL002W
YAL003W
        YAL004W
        YAL005C
                YAL008W
        YAL011W

我想做的就是尝试以某种方式通过管道传输它,以便在写入文件时不包含空空格,当我在 excel 中打开此文件时,这些空空格会转换为白色单元格。我已经尝试了所有可能的 grep、awk 和 sed 组合来删除空格,但没有运气...
所以我得出的结论是,列分别由一个或两个制表符分隔,因此我不能删除它们就像删除空格一样容易,而无需删除文件的格式。

欢迎任何帮助或建议。 谢谢

编辑:

我希望我的输出为三列,制表符分隔,没有空格

YAL002W YAL004W YAL008W
YAL003W YAL005C
        YAL011W

编辑2以避免引用的 XY 问题:

原始问题(X):我必须列出并且我想在两个列表之间找到共同和独特的单词(以便稍后生成维恩图)。所以 comm 似乎是完美的解决方案,因为我同时获得了所有三个列表,稍后我可以轻松地将其导入到 Excel 中。

第二个问题(Y):生成的三列不是三列(或者我开始这么认为),因为我不能 cut -f 它们,也不能使用常用的 awk 'NF'grep . 删除空格(例如)。

最佳答案

给定此输入和 comm 输出:

$ cat file1
YAL002W
YAL003W
YAL008W

$ cat file2
YAL004W
YAL005C
YAL008W
YAL011W

$ comm file1 file2
YAL002W
YAL003W
        YAL004W
        YAL005C
                YAL008W
        YAL011W

这将满足您的要求:

$ cat tst.awk
BEGIN { FS=OFS="\t" }
{
    colNr = NF
    rowNr = ++rowNrs[colNr]
    val[rowNr,colNr] = $NF
    numCols = (colNr > numCols ? colNr : numCols)
    numRows = (rowNr > numRows ? rowNr : numRows)
}
END {
    for (rowNr=1; rowNr<=numRows; rowNr++) {
        for (colNr=1; colNr<=numCols; colNr++) {
            printf "%s%s", val[rowNr,colNr], (colNr<numCols ? OFS : ORS)
        }
    }
}

.

$ comm file1 file2 | awk -f tst.awk
YAL002W YAL004W YAL008W
YAL003W YAL005C
        YAL011W

但是当然您可以跳过对 comm 的调用并立即使用 awk:

$ cat tst.awk
BEGIN { FS=OFS="\t" }
NR==FNR {
    file1[$0]
    next
}
{
    if ($0 in file1) {
        colNr = 3
        delete file1[$0]
    }
    else {
        colNr = 2
    }
    rowNr = ++rowNrs[colNr]
    val[rowNr,colNr] = $0
}
END {
    for (v in file1) {
        colNr = 1
        rowNr = ++rowNrs[colNr]
        val[rowNr,colNr] = v
    }

    numRows = (rowNrs[1] > rowNrs[2] ? rowNrs[1] : rowNrs[2])
    numRows = (numRows   > rowNrs[3] ? numRows   : rowNrs[3])
    numCols = 3
    for (rowNr=1; rowNr<=numRows; rowNr++) {
        for (colNr=1; colNr<=numCols; colNr++) {
            printf "%s%s", val[rowNr,colNr], (colNr<numCols ? OFS : ORS)
        }
    }
}

.

$ awk -f tst.awk file1 file2
YAL002W YAL004W YAL008W
YAL003W YAL005C
        YAL011W

关于linux - 删除通讯输出中的空格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49681893/

相关文章:

python - 如何编写 python 脚本以在 linux mint 中打开应用程序

linux - 如何 grep 查找文件中的某个键?

ruby-on-rails - scrypt 2.0.2 构建失败

linux - uevent 从内核发送到用户空间 (udev)

shell - 将应用程序 shell 项目添加到Windows设备通知对话框

string - AWK:打印列变量,每个字符用空格分隔

PHP 语音识别 API

linux - 如何在 Linux 上使用 "echo"进行 HTTP POST/PUT 请求

sed - grep/sed : How to print *something* when nothing matches

用于在 .CSV 逗号分隔文件中添加双引号的 Bash 脚本