使用 awk 从 csv 中删除特定列

use*_*441 1 awk shell-script csv

我能够以 csv 格式获取列,如下所示:

,列1,列2,列3,列4,列5,,

我使用 awk 命令来获取以下格式的输出:

awk -vORS=, '$0 && p {print $2}; $2 == "name" {p=1} '`
Run Code Online (Sandbox Code Playgroud)

然后我使用以下两个命令删除前导和尾随两个逗号:

   cols=${cols:1}
   cols=${cols:0:${#cols}-2}
Run Code Online (Sandbox Code Playgroud)

现在我得到以下格式的输出:

列 1,列 2,列 3,列 4,列 5

我想从右侧删除与列表匹配的特定列。例如,如果我使用参数“col4,col5”调用该函数,awk 应该删除最后两列并打印输出,如下所示:

列 1,列 2,列 3

如何在 shell 脚本中完成此操作(最好使用 awk 或 grep 或其他一些此类 shell 支持的命令)?

更新:初始文件内容以表格形式输出,如下所示:

+-----------------------------------------+--------+---------+
| name                                    | type   | comment |
+-----------------------------------------+--------+---------+
| col1                                    | int    |         |
| col2                                    | int    |         |
| col3                                    | string |         |
| col4                                    | string |         |
| col5                                    | string |         |
+-----------------------------------------+--------+---------+
Run Code Online (Sandbox Code Playgroud)

Mat*_*inn 5

您可以使用“剪切”从分隔数据中提取某些列。例如,下面提取最后两列:

echo col1,col2,col3,col4,col5 | cut -d , -f 4,5
Run Code Online (Sandbox Code Playgroud)

印刷

col4,col5
Run Code Online (Sandbox Code Playgroud)

-d 参数指定分隔符,-f 指定您希望在结果中出现的结果字段的索引或索引范围

编辑

为了使其更加动态,下面将根据 Y 分隔符选择最后 X 列:

function lastCols {
        endcol=$(($(head -n 1 $1 | grep -o , | wc -l) + 1))
        startcol=$(($endcol-$2+1))
        cut -d $3 -f $startcol-$endcol < $1
}

lastCols $1 $2 $3
Run Code Online (Sandbox Code Playgroud)

我对此没有做过太多测试,所以可能有点问题。使用如下:

[]$ cat temp.txt
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5
col1,col2,col3,col4,col5

[]$ ./lastCols.sh temp.txt 2 ,
col4,col5
col4,col5
col4,col5
col4,col5
col4,col5
col4,col5
col4,col5
col4,col5
col4,col5
Run Code Online (Sandbox Code Playgroud)