2011-07-28 44 views
0

假設我有一個輸入流,其中包含分隔成一定數量字段的行。我想剪切各個領域,向某個程序(假定每個輸入行返回一行)輸入某個字段(或多個字段),並將其他字段保持原樣並粘貼到一起。我大概可以想象一些令人費解的解決方案,但這應該是一種乾淨自然的方式。在命令中輸入輸入流的某個字段,並粘貼結果

作爲一個具體的例子,說我有生產形式的線方案:

$ inputprog 
<a> hello world! 
<b> hi everyone! 
<a> hi! 

說我希望把消息中大寫,而離開第一場不變。這裏是我想象的事情:

$ inputprog | program -d' ' -f2- "tr a-z A-Z" 
<a> HELLO WORLD! 
<b> HI EVERYONE! 
<a> HI! 

我要尋找一個合理的清潔方法近似program。 (我對這個例子特有的解決方案不感興趣。)

在此先感謝您的幫助!

回答

1

awk可以做你想做的。例如:

$ echo "field1 field2" | awk '{$2 = toupper($2); print;}' 
field1 FIELD2 

非常接近你想要做的事情。 $2 = toupper($2);改變第二個字段,而print打印出整個(修改)的行。

但是,您在如何定義「字段」時遇到了問題。在上面的例子中,字段之間用空格隔開(你可以用如下方式將字段分隔符更改爲任意正則表達式:-F'<[a-zA-Z]+>' - 這將被視爲字段分隔符)。 但在您的示例中,您似乎將<a>視爲一個字段,將hello world!視爲另一個字段。任何程序只能通過瘋狂的猜測來達到你想要的行爲。爲什麼world!不被認爲是第三個領域? 因此,如果你能得到一個明確的分隔領域政策的輸入,awk正是你想要的。

查看頁面,如http://people.cs.uu.nl/piet/docs/nawk/nawk_92.html(awk字符串函數)和http://www.pement.org/awk/awk1line.txt(awk 1行)以獲取更多信息。

BTW,人們還可以通過遍歷除第一個所有領域作出上述工作的具體例子(NF ==場數):

$ echo "<a> hello world! 
<b> hi everyone! 
<a> hi" | 
awk '{for(i=2;i<=NF;++i) { $i=toupper($i); }; print;}' 
<a> HELLO WORLD! 
<b> HI EVERYONE! 
<a> HI 

即使你不感興趣的解決方案這個例子。 ;-)

P.S:sed也應該能夠做的工作(http://en.wikipedia.org/wiki/Sed)

+0

感謝您給我們詳細的答覆!我知道'sed'和'awk',但我真的需要將該字段轉換爲我有的用例的外部程序。 'toupper()'適用於這種簡單的情況,但是'awk'內置對於我想做的事來說是不夠的。但是,awk似乎具有將字段傳遞給外部命令的功能,我可以用它來做我想做的事情。謝謝你給我這個主意! :-) – a3nm

相關問題