2014-01-07 4 views
9

Вот мой sample.txt файл содержит следующиеполучить первые 5 символов из каждой строки в сценарии оболочки

31113 70:54:D2 - a-31003 
31114 70:54:D2 - b-31304 
31111 4C:72:B9 - c-31303 
31112 4C:72:B9 - d-31302 

я должен написать сценарий оболочки в том, что я передаю первые 5 символов (например, 31113) в качестве идентификатора ввода для другого сценария. Для этого я попробовал этот

#!/bin/sh 
filename='sample.txt' 
filelines=`cat $filename` 
while read -r line 
do 
    id= cut -c-5 $line 
    echo $id 
    #code for passing id to other script file as parameter 
done < "$filename" 

, но он не работает это дает мне ошибку как

cut: 31113: No such file or directory 
cut: 70:54:D2 No such file or directory 
31114 
31111 
31112 
: No such file or directory 

Как я могу это сделать?

ответ

18

Если вы хотите использовать cut таким образом, вы должны использовать redirection <<< (а здесь строку), как:

var=$(cut -c-5 <<< "$line") 

Обратите внимание на использование var=$(command) выражения вместо id= cut -c-5 $line. Это способ сохранить команду в переменной.

Кроме того, используйте /bin/bash вместо /bin/sh, чтобы он работал.


Полный код, который работает со мной:

#!/bin/bash 

filename='sample.txt' 
while read -r line 
do 
    id=$(cut -c-5 <<< "$line") 
    echo $id 
    #code for passing id to other script file as parameter 
done < "$filename" 
+1

Спасибо за работу как шарм – user2622247

+1

Это действительно работает, но это не идиоматический способ написать это! –

+1

Маленькая семантическая заметка, которая обычно называется «перенаправление», а не «косвенной». («косвенность» обычно используется для обозначения «нелинейных путей через код») – hangtwenty

1

Если вы пытаетесь извлечь первый столбец из файла попробовать awk:

#!/bin/sh 
filename='sample.txt' 

while read -r line 
do 
    id=$(echo $line | awk '{print $1}') 
    echo $id 
    #code for passing id to other script file as parameter 
done < "$filename" 
+0

И как именно это печатает первые 5 символов каждой строки sample.txt? – RedX

+0

@RedX 'awk' разделите каждую строку по (' space' по умолчанию) и напечатайте первое поле ('' {print $ 1} ''), которое является первым 5 символами. –

+0

Ах! Хорошо, не знаю, спасибо. – RedX

2

Может быть, вам это нужно, AWK может распознать пробел автоматически.

awk '{print $1}' sample.txt 
+1

И как именно это печатает первые 5 символов каждой строки sample.txt? – RedX

+0

Видите ли, vanda ответит на вопрос аналогичным образом, это имеет смысл для вас сейчас? иногда запрашивающие лица не знали, как правильно выразить свою просьбу. – BMW

+0

Хе-хе, ты действительно сосредоточиваешься на нем, Реп - ничто. – BMW

6

Вместо трубопровода echo в cut, только труба выход cut непосредственно на время цикла:

cut -c 1-5 sample.txt | 
while read -r id; do 
    echo $id 
    #code for passing id to other script file as parameter 
done 
+0

Зачем вам нужен цикл while? – RedX

+1

Цикл while абсолютно не нужен, если единственная команда - 'echo', но я предполагаю, что в реальном скрипте происходит нечто большее, которое хранится заполнителем:' #code для передачи id в другой файл сценария в качестве параметра' –

13

Ну, его один вкладыш cut -c-5 sample.txt. Пример:

$ cut -c-5 sample.txt 
31113 
31114 
31111 
31112 

Оттуда-на, вы можете конвейеру в любой другой скрипт или команду:

$ cut -c-5 sample.txt | while read line; do echo Hello $line; done 
Hello 31113 
Hello 31114 
Hello 31111 
Hello 31112 
0

Несколько проще, чем верхний ответ:

#!/bin/bash 
filename='sample.txt' 
while read -r line; do 
    id=${line:0:5} 
    echo $id 
    #code for passing id to other script file as parameter 
done < "$filename" 
0

Пожалуйста, проверьте следующее простой пример:

while read line; do id=$(echo $line | head -c5); echo $id; done < file 

, где head -c5 - это правильная команда для получения первых 5 символов из строки.

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