Секция сортировки документов
У меня есть некоторые примеры данных ниже (назовите это test.txt). Я хотел бы разделить этот большой документ на 3 документа, выполнив поиск по первым двум цифрам в 4-м столбце. Я довольно новичок в Linux (Lubuntu 14.04) и изучил 'csplit' и 'awk', но, похоже, не могу снизить синтаксис ни для одного из них. (Я пишу скрипты BASH)
До:
test.txt
12-1-2014 Allow 00:00:00 00:00:00
12-1-2014 Allow 00:00:00 00:00:00
12-2-2014 Allow 01:00:00 01:00:00
12-10-2014 Deny 01:00:00 01:00:00
12-10-2014 Deny 02:00:00 02:00:00
12-11-2014 Deny 02:00:00 02:00:00
После:
test1.txt
12-1-2014 Allow 00:00:00 00:00:00
12-1-2014 Allow 00:00:00 00:00:00
test2.txt
12-2-2014 Allow 01:00:00 01:00:00
12-10-2014 Deny 01:00:00 01:00:00
test3.txt
12-10-2014 Deny 02:00:00 02:00:00
12-11-2014 Deny 02:00:00 02:00:00
3 ответа
Нечто подобное может быть:
#!/bin/bash
while read LINE ; do
[[ -n "`echo $LINE | awk '{print " "$NF}' | grep ' 00:'`" ]] && echo "$LINE" | tee -a test1.txt
[[ -n "`echo $LINE | awk '{print " "$NF}' | grep ' 01:'`" ]] && echo "$LINE" | tee -a test2.txt
[[ -n "`echo $LINE | awk '{print " "$NF}' | grep ' 02:'`" ]] && echo "$LINE" | tee -a test3.txt
done < test.txt
Куда:
while read LINE ; do ; done < FILE
это цикл, который читает каждую строку ФАЙЛА
[[ -n "`<command>`" ]] &&
означает: если <command>
выводит ненулевую строку длины, затем...
echo "these are something"| awk {print $NF} | grep 'thing'
означает: прочитайте "это что-то", оставьте только последний столбец и посмотрите, есть ли в нем "вещь".
echo "something" | tee -a FILE
означает: я печатаю "что-то" в FILE, не перезаписывая что-либо и создавая его, если его еще нет.
С awk
Вы могли бы просто сделать
awk '{split($3,a,":"); print > "test"a[1]+1".txt";}' test.txt
В чистом виде bash
Я не уверен, что лучший способ - хотя вы могли бы сделать что-то вроде
while read -r line; do
read -r a b c d <<< "$line"
printf -v outfile "test%d.txt" $(( ${c%%:*} + 1 ))
printf "%s\n" "$line" >> "$outfile"
done < test.txt
Попробуйте этот скрипт:
#!/bin/bash
while read line; do
HOUR=`echo $line | cut -d' ' -f3 | cut -d':' -f1`;
echo $line >> test-$HOUR.txt;
done < test.txt
Для каждой строки в файле команда cut
сначала разбивает строку space
тогда для :
, Результат используется как суффикс для файла.
Вывод:
file-00.txt file-01.txt file-02.txt
та, которая содержит строку для часа 00, 01 и так далее.