Управление огромным текстовым файлом для извлечения вхождений определенного поля - PullRequest
0 голосов
/ 08 ноября 2019

У меня огромный текстовый файл следующего формата. Я хочу манипулировать этим файлом, чтобы получить номер вхождения поля отдела. В каждом разделе есть поле с именем department:. В результате моей программы мне нужен файл CSV, как указано в разделе Expected output. Я ценю, если решение использует sed или head / tail или awk. Файл действительно огромный. У меня есть около 50000 строк кода. Поэтому эффективный метод высоко ценится.

Input format:


# Person1 Perosn2, AADDC Users, dummydata.somecompany.com
dn: CN=Person1 Perosn2,OU=AADDC Users,DC=dummydata,DC=somecompany,DC=com
objectClass: top
department: 234ABC
name: Person1 Perosn2
objectGUID:: MbCDVZpKbEWRxDUA5iN5IA==
userPrincipalName: abcdef@dummydata.somecompany.com
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=dummydata,DC=somecompany
 ,DC=com
dSCorePropagationData: 16010101000000.0Z
lastLogonTimestamp: 132173602593105876
preferredLanguage: en-US
msDS-AzureADMailNickname: abcdef


# Person1 Perosn2, AADDC Users, dummydata.somecompany.com
dn: CN=Person1 Perosn2,OU=AADDC Users,DC=dummydata,DC=somecompany,DC=com
objectClass: top
department: 234ABC
name: Person1 Perosn2
objectGUID:: MbCDVZpKbEWRxDUA5iN5IA==
userPrincipalName: abcdef@dummydata.somecompany.com
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=dummydata,DC=somecompany
 ,DC=com
dSCorePropagationData: 16010101000000.0Z
lastLogonTimestamp: 132173602593105876
preferredLanguage: en-US
msDS-AzureADMailNickname: abcdef

# Person3 Perosn4, AADDC Users, dummydata.somecompany.com
dn: CN=Person1 Perosn2,OU=AADDC Users,DC=dummydata,DC=somecompany,DC=com
objectClass: top
department: XYZ012
name: Person1 Perosn2
objectGUID:: MbCDVZpKbEWRxDUA5iN5IA==
userPrincipalName: abcdef@dummydata.somecompany.com
objectCategory: CN=Person,CN=Schema,CN=Configuration,DC=dummydata,DC=somecompany
 ,DC=com
dSCorePropagationData: 16010101000000.0Z
lastLogonTimestamp: 132173602593105876
preferredLanguage: en-US
msDS-AzureADMailNickname: abcdef


Expected output

234ABC,2
XYZ012,1

то, что я сделал:

Я использовалэта команда для grep файла. grep '^department: *' file.txt

Но я не уверен, есть ли способ получить ожидаемый результат, используя отдельные команды, такие как sed, grep и т. Д.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2019

Это может работать для вас (GNU sed):

sed -En 's/^department: //;T;G;/^(\S+\n)(\S+\n)*\1/!P;h' file

Игнорировать строки, которые не начинаются department:. Сохраните оставшуюся часть строки в области удержания и, если она уникальна для других строк в области удержания, напечатайте ее.

0 голосов
/ 08 ноября 2019

Не могли бы вы попробовать следующее.

awk '
BEGIN{
  OFS=","
}
{
  gsub(/\r/,"")
}
/department:/{
  string=$NF
  sub(/ +$/,"",string)
  if(!a[string]++){
    b[++count]=string
  }
  ++val[string]
}
END{
  for(i=1;i<=count;i++){
    print b[i],val[b[i]]
  }
}
'  Input_file
...