2015-02-03 1 views
1

У меня есть текстовый файл с сотнями «FirstName LastName Email» в одной строке. Мне нужно разделить строку в 1 наборе в строкеСкрипт оболочки, чтобы проложить первые 3 слова из файла в новый файл, удалить их и цикл

FirstName LastName Email 
FirstName LastName Email 
FirstName LastName Email 

и т.д.

Я изо всех сил, чтобы удалить первые 3 слова из файла после I трубы их в новый файл, таким образом, когда петли сценария , он будет читать следующие 3, трубы, удалить и т.д.

awk '{print $1, $2, $3}' asd >> asd2 | cut -d' ' -f1-3 asd 

Я знаю, вырезать не правильно, но я честно не могу найти способ удаления первых 3 слов, я только поиск «СЭД», чтобы удалить целая линия.

+0

удаления трех столбцов в выводе 'AWK '{печать $ 1, $ 2, $ 3}'' не будет возвращать ничего. –

+0

Я удалил кошку, не уверен, почему я это сделал. В основном, первая часть работает, она прокладывает первые 3 слова в asd2, тогда те же 3 слова должны быть удалены из asd, таким образом, когда я перезапущу команду, она будет транслировать следующие 3 слова – JCats

+1

Это был бы очень простой вопрос чтобы ответить, если бы он был более конкретным, чем «в одной строке» ... что, если чье-то имя будет «Билли Боб», являются ли они 1-м, последним, электронным адресом, разделенным вкладками, пробелами, \ r, \ n, \ r \ n ??? – technosaurus

ответ

0

Здесь не обязательно использовать символ |.

awk '{print $1, $2, $3}' asd >> asd2; sed -i 's/^ *[^ ]\+ \+[^ ]\+ \+[^ ]\+//' asd 

Вы можете добавить [^[:blank:]] вместо [^ ] в команде выше. Измените регулярное выражение на 's/^ *[^ ]\+ \+[^ ]\+ \+[^ ]\+ *//', чтобы удалить также пробелы, которые существуют после третьего слова.

+0

OMG, почему нисходящий сигнал. Его вопрос совсем другой. См. Изменения. –

+0

Возможно, вы хотите написать это в своем ответе ссылкой на ревизии или написать комментарий к OP, чтобы он должен был пометить его как отредактировать или сделать откат. – Rizier123

0
#!/bin/bash 
i=0 
for WORD in $(cat asd) 
do 
    if [[ $i == 3 ]] 
    then 
     i=0 
     printf '\n' >> asd2 
    fi 
    printf "%s" "$WORD " >> asd2 
    i=$((i+1)) 
done 

Редактировать: Ничего себе, я ржавый, мне потребовалось некоторое время, чтобы написать этот дрянной скрипт.

Редактировать: Это помещает каждое три слова в новую строку, но имена и т. Д. Не должны иметь пробелов.

Редактировать: Если в ваших именах есть пробелы, вам нужен скрипт для поиска символа «@» (для сообщений электронной почты) и добавления нового символа линии после этого слова.

0

Если вы пропустили AWK, вы можете также использовать рубин и получить ответ на один шаг:

ruby -e '$stdin.read.split.each_slice(3) {|x| puts x.join " "}' 
3

Использование xargs ...

$ cat asd 
FirstName1 LastName1 Email1 FirstName2 LastName2 Email2 FirstName3 LastName3 Email3 ... 

$ xargs -n3 < asd 
FirstName1 LastName1 Email1 
FirstName2 LastName2 Email2 
FirstName3 LastName3 Email3 
... 

xargs синтаксисом:

xargs -nN [command=echo [args]] 
  1. -n3 означает r un command с 3 аргументами каждый раз.
  2. Если команда не указана, выполняется команда по умолчанию: echo.
0

генерировать конечный файл сразу

sed 's/\(\([^[:space:]]\{1,\}[[:space:]]\{1,\}\)\{2\}[^[:space:]]\{1,\}\)[[:space:]]\{1,\}/\1\ 
/g' Org.txt > NewFormated.txt 

извлекая только 3 первое слова (запрос)

sed 's/\([^[:space:]]\{1,\}[[:space:]]\{1,\}\)\{2\}[^[:space:]]\{1,\}[[:space:]]\{1,\}//' Org.txt > New.txt 

в обеих случаях принимать 3 группы, не пространство отдельного пространства (на самом деле 2 + 1) и использовать или удалить его

3

Этот awk должен делать все это за один проход:

awk -vRS=" " '{ORS=NR%3?RS:"\n"}1' asd 
FirstName LastName Email 
FirstName LastName Email 
FirstName LastName Email 

Установив RS в одну пустоту, одна запись - одно слово.
Затем установите ORS на одно место или новую строку после трех слов.

Это может сократить некоторые:

awk -vRS=" " 'ORS=NR%3?RS:"\n"' asd 
Смежные вопросы