2014-09-25 32 views
3

參數說我有含有一個字,然後是數字,然後是換行文件A.TXT上使用xargs的作爲切

and 3 
now 2 
for 2 
something 7 
completely 8 
different 6 

我需要選擇從每一個字的第n個字符(通過

cat a.txt | cut -d' ' -f2 | xargs -i -n1 cut a.txt -c {} 

我試過這個命令字旁數),它選擇的數量和使用xargs的將它們放到由切-c選項指定,但剪切命令大幹快上的每一行執行的,而不是的a.txt正在循環(我預計會發生這種情況)我該如何解決這個問題?

編輯:由於它似乎不清楚,我想從一個詞中選擇一個字符。我需要選擇的字符可以在單詞旁邊找到,例如: 和3,會給我d。我想整個文件,那麼這將形成一個字:)

+0

我真的不明白你想要做什麼。你想獲得什麼結果?請將其添加到您的問題。 – 2014-09-25 23:51:27

+0

如果我理解的很好,第二行應該返回「e」? – 2014-09-25 23:56:15

+0

@CasimiretHippolyte我的問題現在清楚了嗎?對不起,這是我第一次真的不得不在這裏問一個問題,所以我不知道格式化是如何工作的。這裏應該輸出的詞是'dooier' – wimdetr 2014-09-26 00:03:42

回答

2

純殼溶液:

$ while read word num; do echo ${word:$((num-1)):1}; done < a.txt 
d 
o 
o 
i 
e 
r 

這是使用經典的while; do ... ; done殼環和內建的read。一般的格式是

while read variable1 variable2 ... variableN; do something; done < input_file 

這將遍歷輸入文件的每一行,將它分解成許多變量。默認情況下,它將以空格分割,但可以通過更改$IFS變量來更改它。如果你給一個變量,整個行將被保存,如果你給更多的話,它會填充你提供的變量,並將其餘的保存在最後一個變量中。

在這個特定的循環中,我們正在將這個詞讀入$word並將其編號爲$num。一旦我們有了這個詞,我們可以使用shell的字符串操作功能來提取一個子字符串。一般格式爲

${string:start:length} 

所以,${string:0:2}將前兩個字符從變量$string提取。這裏的變量是$word,開始是數字減1(從0開始計數),長度爲1。結果是由數字給出的位置處的單個字母。

+0

啊,太美了。像這些構造是爲什麼我愛殼。 – bishop 2014-09-26 04:14:29

1

我建議你使用AWK做到這一點:

awk '{print substr($1,$2,1)}' file 

substr採取第一場的一個子從數載開始在第二場和長度的1

測試它(使用從你的問題原始輸入):

$ cat file 
and 3 
now 2 
for 2 
something 7 
completely 8 
different 6 
$ awk '{print substr($1,$2,1)}' file 
d 
o 
o 
i 
e 
r 
+0

使用awk是這個問題的優雅解決方案,但我不應該使用它(這是一項作業) – wimdetr 2014-09-25 23:46:51

+0

@ user3470438您可以使用什麼_can_?您嘗試的方法無效。你有什麼限制? – terdon 2014-09-25 23:53:51

+0

@terdon我可以使用sed和unix命令,但不能使用像AWK,Perl之類的語言。 – wimdetr 2014-09-25 23:55:56