파일에서 첫 번째와 다섯 번째 줄을 추출하여 awk로 쉼표로 구분하여 한 줄에 넣습니다.

파일에서 첫 번째와 다섯 번째 줄을 추출하여 awk로 쉼표로 구분하여 한 줄에 넣습니다.

간단한 음악 재생목록 파일이 있는데 데이터는 다음과 같습니다.

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줄을 추가할 수 있습니다.sedyp

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)

관련 정보