read,echo,awk三者不同组合得到的结果不一样,但不明白,附实例

sh/bash/dash/ksh/zsh等Shell脚本
回复
糊涂的小强
帖子: 71
注册时间: 2014-04-28 14:33
系统: ubuntu12&centos6

read,echo,awk三者不同组合得到的结果不一样,但不明白,附实例

#1

帖子 糊涂的小强 » 2014-05-21 18:27

[xxx@localhost ~]$ while read line1; do awk '{print $0}'; done < test_read
1234 456
[xxx@localhost ~]$ while read line1; do echo "$line1";awk '{print $0}'; done < test_read1
123 1234
234 456
头像
zhw2101024
帖子: 1849
注册时间: 2009-03-28 16:10
系统: Arch debian win7
联系:

Re: read,echo,awk三者不同组合得到的结果不一样,但不明白,附实例

#2

帖子 zhw2101024 » 2014-05-21 19:52

输入文件什么样的?
read每一次读的不一定是一行,具体可以搜索IFS
糊涂的小强
帖子: 71
注册时间: 2014-04-28 14:33
系统: ubuntu12&centos6

Re: read,echo,awk三者不同组合得到的结果不一样,但不明白,附实例

#3

帖子 糊涂的小强 » 2014-05-21 20:12

zhw2101024 写了:输入文件什么样的?
read每一次读的不一定是一行,具体可以搜索IFS
文件内容很简单:
123 1234
234 456
这根分割符有什么关系
头像
astolia
论坛版主
帖子: 6399
注册时间: 2008-09-18 13:11

Re: read,echo,awk三者不同组合得到的结果不一样,但不明白,附实例

#4

帖子 astolia » 2014-05-23 20:17

一个是test_read,另一个test_read1,确定两个文件内容一致?
糊涂的小强
帖子: 71
注册时间: 2014-04-28 14:33
系统: ubuntu12&centos6

Re: read,echo,awk三者不同组合得到的结果不一样,但不明白,附实例

#5

帖子 糊涂的小强 » 2014-05-26 17:42

astolia 写了:一个是test_read,另一个test_read1,确定两个文件内容一致?

代码: 全选

[xxx@localhost ~]$ while read line1; do awk '{print $0}'; done < test_read1
234 456
[xxx@localhost ~]$ while read line1; do echo "$line1";awk '{print $0}'; done < test_read1
123 1234
234 456
[xxx@localhost ~]$ cat test_read1
123 1234
234 456
头像
astolia
论坛版主
帖子: 6399
注册时间: 2008-09-18 13:11

Re: read,echo,awk三者不同组合得到的结果不一样,但不明白,附实例

#6

帖子 astolia » 2014-05-26 19:35

糊涂的小强 写了:
astolia 写了:一个是test_read,另一个test_read1,确定两个文件内容一致?

代码: 全选

[xxx@localhost ~]$ while read line1; do awk '{print $0}'; done < test_read1
234 456
[xxx@localhost ~]$ while read line1; do echo "$line1";awk '{print $0}'; done < test_read1
123 1234
234 456
[xxx@localhost ~]$ cat test_read1
123 1234
234 456
这才对嘛。一楼的肯定是读了两个不同的文件。

标准输入被重定向到了test_read1,read和awk都从里面读数据。
在第一次循环时,read首先读了一行“123 1234”,存放到line1变量中,然后awk再读剩余的一行“234 456”。
在第二次循环时,read没有读到东西,返回非0值,退出while循环。

所以如果不输出line1的内容就只有awk读到的234 456
糊涂的小强
帖子: 71
注册时间: 2014-04-28 14:33
系统: ubuntu12&centos6

Re: read,echo,awk三者不同组合得到的结果不一样,但不明白,附实例

#7

帖子 糊涂的小强 » 2014-05-27 9:38

astolia 写了:
糊涂的小强 写了:
astolia 写了:一个是test_read,另一个test_read1,确定两个文件内容一致?

代码: 全选

[xxx@localhost ~]$ while read line1; do awk '{print $0}'; done < test_read1
234 456
[xxx@localhost ~]$ while read line1; do echo "$line1";awk '{print $0}'; done < test_read1
123 1234
234 456
[xxx@localhost ~]$ cat test_read1
123 1234
234 456
这才对嘛。一楼的肯定是读了两个不同的文件。

标准输入被重定向到了test_read1,read和awk都从里面读数据。
在第一次循环时,read首先读了一行“123 1234”,存放到line1变量中,然后awk再读剩余的一行“234 456”。
在第二次循环时,read没有读到东西,返回非0值,退出while循环。

所以如果不输出line1的内容就只有awk读到的234 456
等等,我无法接受这样的逻辑,read和awk之间有关联吗,read读过的,awk就知道只去读第二行,这是什么机制
头像
astolia
论坛版主
帖子: 6399
注册时间: 2008-09-18 13:11

Re: read,echo,awk三者不同组合得到的结果不一样,但不明白,附实例

#8

帖子 astolia » 2014-05-27 12:08

糊涂的小强 写了:等等,我无法接受这样的逻辑,read和awk之间有关联吗,read读过的,awk就知道只去读第二行,这是什么机制
本来有若干行数据,read读了一行后,这行数据就被read拿走了,awk就只能从剩下的里面读了

你回想一下C里面的基本I/O函数,也是一样的嘛。
先用scanf读了数据,再用getchar也不会读到scanf得到的数据。
先用fscanf读了数据,再用fgetc也不会读到fscanf得到的数据。

具体从是文件读还是从终端读,底层实现会不同,但效果都是这样的
糊涂的小强
帖子: 71
注册时间: 2014-04-28 14:33
系统: ubuntu12&centos6

Re: read,echo,awk三者不同组合得到的结果不一样,但不明白,附实例

#9

帖子 糊涂的小强 » 2014-05-27 12:58

astolia 写了:
糊涂的小强 写了:等等,我无法接受这样的逻辑,read和awk之间有关联吗,read读过的,awk就知道只去读第二行,这是什么机制
本来有若干行数据,read读了一行后,这行数据就被read拿走了,awk就只能从剩下的里面读了

你回想一下C里面的基本I/O函数,也是一样的嘛。
先用scanf读了数据,再用getchar也不会读到scanf得到的数据。
先用fscanf读了数据,再用fgetc也不会读到fscanf得到的数据。

具体从是文件读还是从终端读,底层实现会不同,但效果都是这样的
:em09 谢谢
回复