The UNIX and Linux Forums  
Здравствуйте и добро от Соединенных Штатов UNIX и Linux Форумы! Благодарим Вас за посещение и вступления нашей мирового сообщества.

Go Back   В UNIX и Linux Форумы > Топ форумы > Shell программирование и сценарии
.
Google unix.com



Shell программирование и сценарии Почтовые вопросы о KSH, CSH, SH, BASH, Perl, PHP, SED, AWK и скрипты оболочки и оболочки скриптовых языков здесь.

Подробнее UNIX и Linux Темы форума можно найти полезные
Нить Резьба для начинающих Форум Ответы Последнее сообщение
Разбор файла для отчета (String разбора и расщепления) umar.shaikh Shell программирование и сценарии 8 03-02-2009 01:38 AM
Парсинг фиксированной длины поля с yacc / зубров sungita Программирования высокого уровня 1 01-27-2009 11:27 AM
Читать строку с ведущими пробелами, и найти длину строки dayamatrix UNIX для чайников Вопросы И Ответы 2 11-13-2008 10:08 AM
Разбор запись переменной длины Колючка UNIX для чайников Вопросы И Ответы 17 10-01-2004 08:37 AM
Разбор данных, и при сохранении полной длины переменной app4dxh Shell программирование и сценарии 3 11-22-2002 12:04 PM

Closed Thread
English Japanese Spanish French German Portuguese Italian Dutch Swedish Russian Norwegian Hungarian Hebrew Danish Bulgarian Greek Powered By Powered by Google
 
LinkBack Резьба Инструменты Искать в этом Thread Оценить Thread Режимы дисплея
Old 04-21-2009
ppat7046 ppat7046 is offline
Зарегистрированный пользователь
  
 

Регистрация: Jul 2007
Сообщений: 24
Разбор длиной 286 строка символов

Привет друзья!

Я имею. Текстовый файл, который имеет 13000 записей.
Каждая запись 278 символов длиной.

Я использую ниже код, чтобы извлечь строки и занимает почти 10 минут.
Любое предложение, пожалуйста.

Кошка filename.txt | читать в то время как линия
делать

F1 \u003d `Эхо $ линия | AWK '(печати substr ($ 1,1,9))'`
f2 \u003d `Эхо $ линия | AWK '(печати substr ($ 1,10,20))'`
F3 \u003d `Эхо $ линия | AWK '(печати substr ($ 1,30,50))'`
f4 \u003d `Эхо $ линия | AWK '(печати substr ($ 1,80,10))'`
f5 \u003d `Эхо $ линия | AWK '(печати substr ($ 1,90,50))'`
f6 \u003d `Эхо $ линия | AWK '(печати substr ($ 1,140,10))'`
F7 \u003d `Эхо $ линия | AWK '(печати substr ($ 1,150,50))'`
F8 \u003d `Эхо $ линия | AWK '(печати substr ($ 1,200,10))'`
F9 \u003d `Эхо $ линия | AWK '(печати substr ($ 1,210,50))'`
F10 \u003d `Эхо $ линия | AWK '(печати substr ($ 1,260,10))'`
F11 \u003d `Эхо $ линия | AWK '(печати substr ($ 1,270,8))'`
F12 \u003d `Эхо $ линия | AWK '(печати substr ($ 1,278,8))'`

S1 \u003d `Эхо $ f1" | "$ f2" | "$ F3" | "$ F4" | "$ f5" | "`
s2 \u003d `Эхо $ f6" | "$ f7" | "$ F8" | "`
s3 \u003d `Эхо $ F9" | "$ F10" | "`
S4 \u003d `Эхо $ F11" | "$ F12`

Эхо $ S1 $ s2 $ s3 $ S4>> FinalResult.txt
готово
Old 04-21-2009
vgersh99's Avatar
vgersh99 vgersh99 is online now Forum Staff  
Модератор
  
 

Регистрация: Февраль 2005
Место: Boston, MA
Сообщения: 5122
nawk-F fieldwidth.awk filename.txt> FinalResul.txt

fieldwidth.awk:
Код:
function setFieldsByWidth(   i,n,FWS,start,copyd0) {
  # Licensed under GPL Peter S Tillier, 2003
  # NB corrupts $0
  copyd0 = $0                             # make copy of $0 to work on
  if (length(FIELDWIDTHS) == 0) {
    print "You need to set the width of the fields that you require" > "/dev/stderr"
    print "in the variable FIELDWIDTHS (NB: Upper case!)" > "/dev/stderr"
    exit(1)
  }

  if (!match(FIELDWIDTHS,/^[0-9 ]+$/)) {
    print "The variable FIELDWIDTHS must contain digits, separated" > "/dev/stderr"
    print "by spaces." > "/dev/stderr"
    exit(1)
  }

  n = split(FIELDWIDTHS,FWS)

  if (n == 1) {
    print "Warning: FIELDWIDTHS contains only one field width." > "/dev/stderr"
    print "Attempting to continue." > "/dev/stderr"
  }

  start = 1
  for (i=1; i <= n; i++) {
    $i = substr(copyd0,start,FWS[i])
    start = start + FWS[i]
  }
}

#Note that the "/dev/stderr" entries in some lines have wrapped.

#I then call setFieldsByWidth() in my main awk code as follows:
BEGIN {
  #FIELDWIDTHS="7 6 5 4 3 2 1" # for example
  # adjust the FIELDWIDTHS values as you see fit.
  FIELDWIDTHS="9 21 51 11 51 11 51 11 51 11 9 9" # for example
  OFS="|"
}
!/^[  ]*$/ {
  saveDollarZero = $0 # if you want it later
  setFieldsByWidth()
  # now we can manipulate $0, NF and $1 .. $NF as we wish
  # print $0 OFS
  print $1,$2,$3,$4,$5,$6,$7,$9,$10,$11,$12
  next
}
Old 04-21-2009
JerryHone JerryHone is offline
Зарегистрированный пользователь
  
 

Регистрация: Nov 2006
Место проведения: Великобритания
Сообщений: 178
А проще Метод заключается в том, чтобы создать сценарий parse.awk

Код:
{
f1=substr($1,1,9);
f2=substr($1,10,20);
f3=substr($1,30,50);
f4=substr($1,80,10);
f5=substr($1,90,50);
f6=substr($1,140,10);
f7=substr($1,150,50);
f8=substr($1,200,10);
f9=substr($1,210,50);
f10=substr($1,260,10);
f11=substr($1,270,8);
f12=substr($1,278,8);

OFS="|";
print f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12;
print "\n";
}
Затем запустите

Код:
awk -f parse.awk filename.txt > FinalResult.txt
Я считаю, что исходный код занимает много времени, поскольку каждый backtick, эхо и AWK является нерестовой новый процесс
Old 04-21-2009
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell программист, автор
  
 

Регистрация: Mar 2007
Место проведения: Торонто, Канада
Сообщения: 2361
Код:
awk '{
 print  substr($1,1,9) "|" \
        substr($1,10,20) "|" \
        substr($1,30,50) "|" \
        substr($1,80,10) "|" \
        substr($1,90,50) "|" \
        substr($1,140,10) "|" \
        substr($1,150,50) "|" \
        substr($1,200,10) "|" \
        substr($1,210,50) "|" \
        substr($1,260,10) "|" \
        substr($1,270,8) "|" \
        substr($1,278,8)
}' filename.txt > FinalResult.txt
Old 04-22-2009
amitmathapati amitmathapati is offline
Зарегистрированный пользователь
  
 

Регистрация: Апрель 2009
Сообщений: 1
Привет PPL ..

Что делать, если я линия, как этот
А BCD

, которая свидетельствует о том, что первое поле f1 \u003d A, F2 \u003d F3 \u003d BCD
т.е. второе поле пустым 6 символов. Итак, если я использую скрипт, я не смог получить поля в этом случае.
Можете ли вы предложить в этом случае, как идти о нем?

Cheers Амит
Old 04-22-2009
cfajohnson's Avatar
cfajohnson cfajohnson is offline Forum Advisor  
Shell программист, автор
  
 

Регистрация: Mar 2007
Место проведения: Торонто, Канада
Сообщения: 2361

Используйте $ 0, вместо $ 1 (который является то, что я должен использовать):

Код:
awk '{
 print  substr($0,1,9) "|" \
        substr($0,10,20) "|" \
        substr($0,30,50) "|" \
        substr($0,80,10) "|" \
        substr($0,90,50) "|" \
        substr($0,140,10) "|" \
        substr($0,150,50) "|" \
        substr($0,200,10) "|" \
        substr($0,210,50) "|" \
        substr($0,260,10) "|" \
        substr($0,270,8) "|" \
        substr($0,278,8)
}' filename.txt > FinalResult.txt
Old 04-22-2009
ppat7046 ppat7046 is offline
Зарегистрированный пользователь
  
 

Регистрация: Jul 2007
Сообщений: 24
Спасибо всем вам за ваш ответ.

Я использовал предложение представленной cfajohnson и сейчас она занимает только 20 secconds при разборе 800,000 записей.

Большое спасибо,
Prashant
Closed Thread

Закладки

Резьба Инструменты Искать в этом Thread
Искать в этом Thread:

Расширенный поиск
Режимы дисплея Оценить эту ветку
Оценить эту ветку:

Отправка Правила
Вы не может Начать новую нитей
Вы не может Почтовые ответы
Вы не может Почтовые вложения
Вы не может Редактировать Ваши сообщения

BB код быть На
Смайлики являемся На
[IMG] код На
HTML-код Вне
Trackbacks являемся На
Pingbacks являемся На
Refbacks являемся На




Часовой пояс GMT -4. Текущее время 11:56 PM.


Powered By: Справка, Copyright © 2000 - 2006, Jelsoft Enterprises Limited. Язык Переводы на питание от .
vBCredits v1.4 Copyright © 2007 - 2008, PixelFX Studios
В UNIX и Linux форумы Содержание Copyright © 1993-2009. Все права Reserved.Ad управления по RedTyger

Содержание соответствующие URL-адреса в vBSEO 3.2.0