2013-06-21 55 views
0

我正在尝试做一些非常简单的事情,但按照我想要的方式解决它也会帮助我完成许多其他命令。如何在UNIX中逐行输入输入,在每一行执行命令并立即返回输出?

我想在UNIX中逐行读取文件,并在它们上执行命令,在这种情况下字符数。对于整个文件,我只会使用:

wc -m 

但是,我希望每行输入。通过UNIX命令进行操作,一行一行地流式传输文件最简单,最简单的方法是什么?我问,因为在这种情况下,我想每行都使用wc -m,但未来的应用程序将使用完全不同的命令。

另外,我想避免perl和awk!我已经知道如何用这些工具做到这一点,但我正在寻找其他方法。

谢谢!

编辑:谢谢你的链接到另一个问题,但看到他们的4个答案后,我没有看到我的确切困惑的解决方案。

鉴于以下输入:

cat test.txt 
    This is the first line. 
    This is the second, longer line. 
    This is short. 
    My Final line that is much longer than the first couple of lines. 

我想通过一些代码,将一行阅读线和每行执行命令,将立即返回结果插上电源。

一些代码,做wc -m每行并返回输出:

23 
32 
14 
65 

或者一些代码,做cut -d " " -f 1每行并返回输出:

This 
This 
This 
My 

希望这使事情位清晰。再次感谢您的任何建议!

+0

的可能重复的[遍历在bash文本文件的每一行(http://stackoverflow.com/questions/9353882/loop-over-每行文本文件在bash) – Vicky

+0

很难想象你期望的输出。你能否包含一些简单的样本输入和来自该输入的预期输出?祝你好运。 – shellter

+0

当然,会做。我正在编辑问题... – jake9115

回答

5

您可以使用echo "${#line}"来了解字符串的长度。用while read...读取该文件将做休息:

$ cat file 
hello 
my name 
is fedor 
qui 


$ while read line; do echo "${#line}"; done < file 
5 
7 
8 
3 
0 

在一个更好的格式:

while read line 
do 
    echo "${#line}" 
done < file 
+0

嗨,谢谢你的回答。这与我所寻找的非常接近,但并不完全。我希望能够在每行输入中使用任何UNIX命令并立即返回结果。在这种情况下,你的代码可以工作,因为你使用'$ {#line}',但是如果我使用'wc -m',我会得到文件中的全部字符。我想要一些可以用于任何UNIX命令的东西! – jake9115

+0

提供的答案与您在问题中的具体情况相同。所以试着更具体一些......为什么'$ {#line}'不会有用? – fedorqui

+0

对不起,这是我的错误,因为当我问我没有足够具体。我已经修改了我的问题。我对字符数并不是真正感兴趣,而是一种用于任何UNIX命令的逐行流式传输机制。 – jake9115

1

您的行由行处理最好的办法是while read循环,虽然成语使用保留行确切是:

while IFS= read -r line; do 
    # process "$line" 
done 

未能使用IFS=将失去领先的空白。未使用read -r意味着一些反斜杠序列将被bash解释并且不会被逐字保存在变量中。

我觉得你可以奎德里重述:

我有一行文字。我如何像对待文件一样对待它?

bash有2个功能,可以回答这个

  1. wc命令可从标准输入读取,使用here-string

    wc -m <<< "$line" 
    
  2. 对于需要文件的命令(我不能想到一个关闭我的头顶),使用process substitution

    wc -m <(echo "$line") 
    

实施例:

$ line="foo bar baz" 
$ wc -m <<<"$line" 
12 
$ wc -m <(echo "$line") 
12 /dev/fd/63 

P.S. 我注意到char count包含隐含的尾随换行符。要删除,使用的printf不换行格式字符串

$ wc -m <(printf %s "$line") 
11 /dev/fd/63 
$ wc -m < <(printf %s "$line") 
11