gpt4 book ai didi

bash - AWK:打印 $i 什么都不返回

转载 作者:行者123 更新时间:2023-11-29 09:35:41 24 4
gpt4 key购买 nike

$file 是一个包含 59 列和 64 行的 csv(制表符分隔)。第 1 列始终是字符串,列 2+ 始终是整数(当值为 NULL 时除外)。

cat ${file} | while read line 
do awk -F'\t' '{ for (i=2; i<=NF; i++) print $1 "\t" $i "." }';
done;

输出:

Excellent   .
Good .

然而将 $i 切换为 $2 仍然有效:

Excellent   29.
Good 7.

为什么??

编辑:

#lines 1 & 2 from data.csv (columns truncated for brevity):
Excellent 29 54 47 46 38 22 50
Good 7 14 27 24 26 36 20

#reform.sh
file=$1;
awk -F'\t' '{ for (i=2; i<=NF; i++) print $1 "\t" $i; }' ${file};

仍然像以前一样表现/返回。

解决方案:

批准的答案确实提供了 AWK 的正确输出。重新启动我的终端应用程序后,脚本按照描述执行。我无法确定终端应用问题的原因。

最佳答案

我想你错了。你拥有的脚本不会输出任何智能 (a) 因为当你试图将每一行读入 $line 时,你实际上并没有给出他们awk

你可以用类似的东西摆脱多余的(和不正确的)循环:

awk -F'\t' '{ for (i=2; i<=NF; i++) print $1 "\t" $i "." }' ${file}

如以下抄本所示:

pax> echo 'A 1 2
...> B 3 4
...> C 5 6' >qq.in

pax> cat qq.in
A 1 2
B 3 4
C 5 6

pax> awk -F' ' '{ for (i=2; i<=NF; i++) print $1 " " $i "." }' qq.in
A 1.
A 2.
B 3.
B 4.
C 5.
C 6.

如您所见(尽管我使用的是空格而不是制表符),这会为您提供所需的输出。


针对您断言它仍然 不工作的说法,恐怕我不得不提出不同意见。以下文字记录(带标签)表明它像宣传的那样工作。

pax> cat qq.in
Excellent 29 54 47 46 38 22 50
Good 7 14 27 24 26 36 20

pax> awk -F'\t' '{ for (i=2; i<=NF; i++) print $1 "\t" $i; }' qq.in
Excellent 29
Excellent 54
Excellent 47
Excellent 46
Excellent 38
Excellent 22
Excellent 50
Good 7
Good 14
Good 27
Good 24
Good 26
Good 36
Good 20

如果它在您的环境中实际上不起作用,那就是另一回事了。您可能有错误的 awk 或任何其他导致失败的原因。

首先,弄清楚 awk 的版本和您使用的操作系统,例如:

awk --version
uname -a

(a):它确实输出了一些东西,但几乎可以肯定不是您所期望的。让我们实际看看现实中发生了什么。考虑以下与您的原始记录相似的记录:

pax> ( echo 1; echo 2; echo 3 ) | while read line ; do
...> awk '{print "[" $0 "]"}'
...> done
[2]
[3]

现在看起来很奇怪,它似乎在丢弃第一行。

这是因为 whileawk 之间的脱节。 while 从标准输入读取第一行并将其分配给 $line,然后执行 do..done 部分的主体。

该主体是一个没有输入文件的 awk,因此它从标准输入中获取输入!

这意味着它将“吸取”其余的标准输入流并进行处理。

然后,它将返回到 while 循环,但是,由于标准输入上没有更多数据,它将结束。或许更好地说明:

pax> ( echo 1; echo 2; echo 3 ) | while read line ; do
...> echo "read: $line"
...> awk '{print "awk: " $0}'
...> done
read: 1
awk: 2
awk: 3

如果您实际上连接 whileawk 与下面的 echo "$line"| 部分,你会看到它正常工作:

pax> ( echo 1; echo 2; echo 3 ) | while read line ; do
...> echo "$line" | awk '{print "[" $0 "]"}'
...> done
[1]
[2]
[3]

当然,当 awk 完全能够处理多行时,将您的输入分成多行并将它们一次发送到 awk 毫无意义一次一个。

因此,此答案的第一个代码块中显示的单行 awk 命令仍然是一种更好的方法。

关于bash - AWK:打印 $i 什么都不返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12791269/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com