2015-12-15 2 views
0

Как выполнить итерацию файла и напечатать только первое слово. Строка разделяется двоеточием. пример корень: 01: 02: toorИзвлечь первое слово в текстовом файле, разделенном двоеточием

файл содержит несколько строк. И это то, что я сделал до сих пор, но он не работает.

FILE=$1 
k=1 
    while read line; do 
     echo $1 | awk -F ':' 
((k++)) 
done < $FILE 

Я не очень хорошо разбираюсь в bash-scripting. Так что это, вероятно, очень тривиально для одного из вас.

изменить: переменная k - подсчет строк.

+0

Хорошо, теперь я вижу свою ошибку.Я предположил, что мне нужен цикл для итерации строк в файле. Я могу просто использовать «cut -d:», поскольку он не имеет цикла – KimR

ответ

3

Использование cut:

cut -d: -f1 filename 
  • -d определяет разделитель
  • -f определяет поле (ы), чтобы сохранить

Если вам нужно сосчитать линии, просто

count=$(wc -l < filename) 
  • -l говорит wc для подсчета строк
3
awk -F: '{print $1}' FILENAME 

Это будет печатать первое слово, разделенное двоеточием. Это то, что вы ищите?

Чтобы использовать цикл, вы можете сделать что-то вроде этого:

$ cat test.txt 
root:hello:1 
user:bye:2 

test.sh

#!/bin/bash 

while IFS=':' read -r line || [[ -n $line ]]; do 
    echo $line | awk -F: '{print $1}' 
done < test.txt 

Пример чтения построчно в Баш: Read a file line by line assigning the value to a variable

Результат:

$ ./test.sh 
root 
user 
+0

Я должен сделать сценарий. Поэтому мне нужно иметь петлю. Я не знаю, нужно ли вообще использовать awk, есть ли лучшие решения для этой проблемы? – KimR

1

Раствор с помощью Perl

%> perl -F: -ane 'print "$F[0]\n";' [file(s)] 

изменить «\ п» в «», если вы не хотите, новая строка печатается.

1

Вы можете получить первое слово, без каких-либо внешних команд в Баш, как так:

printf '%s' "${line%%:*}" 

, который будет иметь доступ к переменной с именем line и удалите все, что соответствует Glob :* и сделать так жадно, так как можно ближе к спереди (это %% вместо одного %).

Хотя с этим решением вам нужно сделать цикл самостоятельно. Если это единственное, что вы хотите сделать с переменной, то решение cut лучше, поэтому вам не нужно самостоятельно выполнять итерацию файла.

+0

в комментарии, который я написал по моему вопросу. Можете ли вы ответить, почему «cut-command» извлекает первое слово в каждой строке без цикла? моя интуиция подсказывает мне, что она только «читает» первую строчку. – KimR

+0

Нет, она применит правила, которые вы даете ей каждой строке в файле. Из 'man cut':« Распечатайте выбранные части строк из каждого ФАЙЛА на стандартный вывод ». Многие команды будут работать с файлами, поэтому это почти не так часто необходимо, как это делается для того, чтобы люди перебирали строки самого файла. В самом деле, большая часть времени команды фактически предназначены для работы с файлом, и мы должны «обмануть» их, чтобы сделать одну строку, связав ее и прочитав из «файла» 'stdin' –

+0

Спасибо! Хорошее объяснение. – KimR

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