복잡한 파일 구조에서 데이터 추출

복잡한 파일 구조에서 데이터 추출

데이터베이스 덤프이고 한 줄에 하나의 항목이 포함된 txt 파일이 있습니다. 구조는 다음과 같습니다.

1500
29/03/2010 
18
02
09
47
17
45
28.248
0
0.01
130
12.721
7908
298,809
YES
3.046.550,39
6.500.000,00
17,444,222


1501
30/03/2010
27
54
28
50
22
03
37.223
0
0.00
97
22,466
7379
421.90
NO
20,262,429
25,000,000.01
17,995,281.33


... the third record starts here

데이터베이스에는 21개의 필드가 포함되어 있습니다. 이전 줄은 이 데이터베이스의 두 레코드 덤프를 보여줍니다. 빈 행은 데이터베이스의 빈 필드를 나타냅니다.

첫 번째 필드(F0)는 1500, 1501...

두 번째 필드(F1)는 일, 월, 연도 형식의 날짜입니다.

필드 F2, F3, F4, F5, F6 및 F7은 6개의 정수입니다.

나에게 필요한 것은 이 파일에서 F0, F2, F3, F4, F5, F6, F7을 추출하여 각 파일에 대한 행을 만드는 것입니다.

위의 두 레코드가 주어지면 최종 파일은 다음과 같습니다.

1500,18,02,09,47,17,45
1501,27,54,28,50,22,03

나는 수 마일에 달하는 bash 스크립트를 사용하여 이 작업을 수행하고 모든 줄에서 상호 작용하는 방법 등을 알고 있습니다. 그러나 나는 또한 유닉스가 많은 트릭, 특히 명령이라는 것을 알고 있으며 sed이것은 아마도 간단한 한 줄로 이루어질 수 있습니다. 저는 새로운 것을 배우는 걸 좋아해서 유닉스 고수님들께 어떻게 하면 좋을지 여쭤보고 싶습니다.

저는 OSX Mavericks를 사용하고 있습니다. 감사해요.

답변1

사용 awk:

awk '
  BEGIN {
    fields[1]
    fields[3]
    fields[4]
    fields[5]
    fields[6]
    fields[7]
    last_field=8
  }
  ( NR%21 in fields ) { printf($0",") }
  NR%21==last_field' in_file.txt

아니면 더 나은 방법은 다음과 같습니다.

awk '
  NR%21 ~ /^(1|3|4|5|6|7)$/ { printf($0",") }
  NR%21==8' in_file.txt

GNU에는 sed주어진 줄 다음의 n번째 줄을 일치시키는 멋진 확장 기능이 있는데, 이는 여기서 유용합니다. OSX에서는 작동하지 않지만 재미를 위해 다음을 수행합니다.

sed -n '
  1~21 { h }
  3~21,7~21 { H }
  8~21 { H; g; s/\n/,/gp }' in_file

답변2

한 가지 방법은 다음과 같습니다.

$ perl -000ne '@f=split(/\n/); print join(",",@f[0,2..7]) , "\n"' file.txt  
1500,18,02,09,47,17,45
1501,27,54,28,50,22,03

설명하다:

  • -000perl: 필드 구분 기호를 연속적인 줄 바꿈으로 설정하는 단락 모드를 활성화합니다 \n\n. 이는 각 레코드를 행으로 처리한다는 의미입니다.

  • @f=split(/\n/);: 현재 줄(레코드)을 개행 문자로 나누어 배열로 저장합니다 @f. 이제 배열에는 레코드의 모든 필드가 포함됩니다. 이는 배열 조각에 @f[0,2..8]필드 0과 2~8이 포함된다는 의미입니다.

  • print join ",",@f[0,2..8] , "\n"': 배열 조각을 쉼표로 연결하고 결과 문자열을 인쇄한 다음 개행 문자를 인쇄합니다.

답변3

데이터에 항상 특정 개수의 누락된 필드가 있는 경우(레코드 사이에 2개 이상의 하드 리턴이 있는 경우) 간단히 다음을 수행할 수 있습니다.

$ awk -v RS="\\n{2,}" -F"\\n" -v OFS="," '{print $1, $3, $4, $5, $6, $7, $8}' file.txt
1500,18,02,09,47,17,45
1501,27,54,28,50,22,03

관련 정보