간단한 음악 재생목록 파일이 있는데 데이터는 다음과 같습니다.
Song
Artist
Album
Date Song was added to playlist (mm/dd/yyyy)
Song Duration (mm:ss)
내가 하고 싶은 것은 노래와 아티스트를 한 줄에 넣고 이를 새로운 csv 파일(music.csv라고 가정)로 내보내는 것입니다.
그래서 그냥
Song,Artist
Song,Artist
기타 등등
n번째 줄마다 인쇄하는 방법을 알고 있지만 n번째 줄마다 + 다른 줄을 인쇄하도록 할 수는 없습니다.
답변1
awk '
NR % 5 == 1 {printf "%s,", $0}
NR % 5 == 2
' file
답변2
GNU를 사용하면 sed
매 5줄 중 첫 번째 줄을 예약된 공간에 넣을 수 있습니다 1~5h
. 그런 다음 다음을 H
사용하여 예약된 g
공간 에 5줄마다 2줄을 추가할 수 있습니다.sed
y
p
sed -n -e '1~5h' -e '2~5 { H; g; y/\n/,/; p; }' file
paste
를 사용하여 5개 라인의 각 세트를 단일 탭으로 구분된 레코드로 형식화하고, 를 사용 cut
하여 각 레코드의 첫 번째 및 두 번째 필드를 추출한 다음, 다음을 사용하여 구분 탭 문자를 쉼표로 바꿀 수 있습니다 tr
.
paste - - - - - < file | cut -f 1,2 | tr '\t' ','
또는 노래 필드와 아티스트 필드 모두에 쉼표가 포함되어 있지 않은 경우
paste -d, - - - - - < file | cut -d, -f 1,2
위와 같이 각 5개 행 집합을 탭으로 구분된 한 줄 레코드로 변환한 다음 CSV 인식 Miller 도구를 사용하여 각 레코드에서 처음 두 필드를 추출하고 CSV를 출력합니다.
paste - - - - - < file | mlr --itsv --ocsv -N cut -f 1,2
이에 대한 추가 이점은 삽입된 쉼표나 따옴표가 포함된 모든 출력 필드를 자동으로 인용할 수 있어 CSV 인식 파서가 데이터를 올바르게 읽을 수 있다는 것입니다.
답변3
sed
이는 선을 추출하고 paste
그 조합을 연결함으로써 비교적 간단하게 수행할 수 있습니다.
$ seq 20 | sed -n 'p;n;p;n;n;n' | paste -d, - -
1,2
6,7
11,12
16,17
답변4
awk를 사용하십시오.
$ awk -v RS= -F'\n' -v OFS=',' '{print $1,$2}' file
Song,Artist
Song,Artist
위 추측 입력의 레코드는 1개 이상의 빈 줄로 구분됩니다. 예를 들면 다음과 같습니다.
$ cat file
Song
Artist
Album
Date Song was added to playlist (mm/dd/yyyy)
Song Duration (mm:ss)
Song
Artist
Album
Date Song was added to playlist (mm/dd/yyyy)
Song Duration (mm:ss)
그러나 이는 단지 추측일 뿐입니다. 귀하의 예에서는 1개의 입력 레코드만 제공했기 때문에 레코드를 분리하는 방법을 보여주지 않았습니다.
또는 레코드 사이에 빈 줄이나 다른 구분 기호가 없고 단지 5줄 블록인 경우 다음이 원하는 것일 수 있습니다.
$ awk -v OFS=',' '{a[n=NR%5]=$0} !n{print a[1],a[2]}' file
Song,Artist
Song,Artist
두 번째 스크립트는 다음 입력을 가정합니다.
$ cat file
Song
Artist
Album
Date Song was added to playlist (mm/dd/yyyy)
Song Duration (mm:ss)
Song
Artist
Album
Date Song was added to playlist (mm/dd/yyyy)
Song Duration (mm:ss)