首页 > 解决方案 > Bash 函数:变成一个二维数组,删除一个索引标识的行和列

问题描述

我正在尝试创建一个 bash 函数(基本上,放入我的 bashrc 中)。

目标是删除由数字(整数)索引的行和列,该数字是 bash 函数 ( $2) 的第二个参数,第一个参数是文件名 ( $1)。

我试过了,但我无法让它工作(我在 MacOS Mojave 下):

function remove_line_column() { gsed '"$2"d' $1 | awk -v ind_field=$2 '!(ind_field="")' ;}

我在expanding Shell arguments(like "$2") 和Shell arguments(like only $2) 之间做混淆。

在直接命令行中,我可以通过执行以下操作获得想要的结果(删除第 8 行和第 8 列):

awk 'NR == 8 {next} {print}' file.txt | awk '!($8="")'

如何将其实现为 Bash 函数?

我想像这样从终端调用它:

$remove_line_column file.txt 8`

标签: bashawksed

解决方案


remove_line_column() {
  awk -v remove="$2" 'NR == remove {next} {$remove = ""; print}' <"$1"
}

...用于:

$ printf '%s\n' '1 2 3' '4 5 6' '7 8 9'
1 2 3
4 5 6
7 8 9
$ printf '%s\n' '1 2 3' '4 5 6' '7 8 9' | remove_line_column /dev/stdin 2
1  3
7  9
$ printf '%s\n' '1 2 3' '4 5 6' '7 8 9' | remove_line_column /dev/stdin 3
1 2
4 5

推荐阅读