2014-09-25 1 views
3

Скажем у меня есть файл, содержащий a.txt слово, за которым следует число, за которым следует символ новой строки нас помощью xargs в качестве аргумента для вырезания

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

нужно выбрать п-й символ из каждого слова (определяется числом рядом со словом)

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

Я попытался эту команду, которая выбирает число и использует xargs, чтобы поместить их в опции -c от разреза, но команда покрой исполняются на каждой строке, а of.txt зацикливается (что я ожидал увидеть) Как я могу решить эту проблему?

EDIT: Поскольку кажется неясным, я хочу выбрать персонажа из слова. Символ, который мне нужно выбрать, можно найти рядом со словом, например: и 3, даст мне d. Я хочу сделать это для всего файла, который будет образовывать слово :)

+0

Я действительно не понимаю, что вы пытаетесь сделать. Каков результат, который вы хотите получить? Пожалуйста, добавьте его в свой вопрос. –

+0

Если я хорошо понимаю, вторая строка должна вернуть «e»? –

+0

@CasimiretHippolyte Я сейчас понял вопрос? Извините, это первый раз, когда я на самом деле должен был задать вопрос здесь, поэтому я не знаю, как работает форматирование. Слово, которое должно быть выведено здесь, является «dooier» – wimdetr

ответ

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. Как только у нас есть слово, мы можем использовать возможности манипуляции с оболочкой для извлечения подстроки. Общий формат

${string:start:length} 

Так, ${string:0:2} бы извлечь первые два символа из переменной $string. Здесь переменная $word, начало - это число минус один (это начинается с 0), а длина равна единице. Результатом является единственная буква в позиции, заданной номером.

+0

А, так красиво. Такие конструкции, вот почему я люблю оболочку. – bishop

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

+0

@ user3470438 Что вы используете _can_? Подход, который вы пытаетесь, не будет работать. Каковы ограничения, которые у вас есть? – terdon

+0

@terdon Я могу использовать команды sed и unix, но не такие языки, как AWK, perl и т. П. – wimdetr

 Смежные вопросы

  • Нет связанных вопросов^_^