我有一个文件,比如说 5 列(通过重定向 Sybase 选择查询的结果获得)。每列由一个制表符分隔。我需要过滤掉所有为 NULL 的列。五列中的任何列都可以为空。
例如,如果文件中的列如下所示:
1000 NULL NULL 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
7 NULL 1000 2 NULL
输出必须是(在删除第 2 列和第 5 列之后),最好在同一个文件中:
1000 NULL 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
7 1000 2
我到了:
for i in {1..5}
do
echo $i
dlr="$"$i
str="{print $dlr}"
echo $str
awk '$str' <input_file> | while read value
do
echo $value
if [ "$value" == "NULL" ]
then
echo "inside"
cut $i
fi
done
done
现在的值,显示所有行!!!另外,我不知道如何切断列。我是一个 shell 脚本初学者,无法继续。
你能告诉我怎么做吗?
通过GNU 实用程序
datamash
,您首先反转行,然后删除所有空行并再次反转行:如果不处理文件两次,您将无法做到这一点。以下是首先使用
awk
来构造最终cut
命令:我不太喜欢这个解决方案,但它似乎有效:
input
(您的输入文件)skip
(稍后将填充的数组)c
(将设置为文件中的列数。这假设整个文件具有统一的列数)NULL
. 如果是这样,我们将该列号添加到skip
数组中IFS
为逗号(我使用子外壳的原因)并将skip
数组作为逗号分隔值传递给awk
变量。这样我们就可以split
将该变量转换回awk
数组。awk
然后将遍历s
数组中的每个数字并将该列设置为空并打印剩余的内容。命令:
输出