데이터베이스 덤프이고 한 줄에 하나의 항목이 포함된 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
설명하다:
-000
perl
: 필드 구분 기호를 연속적인 줄 바꿈으로 설정하는 단락 모드를 활성화합니다\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