첫 번째 필드를 기준으로 파일 줄 분할

첫 번째 필드를 기준으로 파일 줄 분할

내 파일 내용은 아래와 같으며 내 출력을 아래와 같이 변환하고 싶습니다.

  • 입력하다

    1,a,b,c
    2,b,c
    3,e,f
    4,l
    
  • 원하는 출력

    1,a
    1,b
    1,c
    2,b
    2,c
    3,e
    3,f
    4,l
    

첫 번째 필드의 값은 고유하며 입력의 첫 번째 필드에 중복된 행이 없습니다.

저는 스크립팅을 처음 접했고 이 작업을 어떻게 수행할 수 있는지 모르겠습니다.

답변1

awk2로 시작하는 필드를 사용하고 반복할 수 있습니다 .

awk -F, '{ OFS=FS; for (i=2;i<=NF;i++) print $1,$i }' file

산출:

1,a
1,b
1,c
2,b
2,c
3,e
3,f
4,l

답변2

그것으로 sed당신은 할 것입니다

sed -E 's/([^,]*,)([^,]*),/\1\2\n\1/;P;D' file

\n대체 문자열에 사용하는 것은 GNU에서만 작동합니다 sed. 다른 시스템에서는 백슬래시 앞에 실제 줄바꿈을 사용해야 합니다.

sed -E 's/([^,]*,)([^,]*),/\1\2\
\1/;P;D' file
  • -E()가독성을 위해 사용할 수 있는 확장 정규식을 의미합니다 \(\).
  • [^,]*쉼표 없이 문자열과 일치하므로 필드와 일치합니다.
  • 따라서 [^,]*,[^,]*,처음 두 필드가 일치합니다. ()교체 시 \1재사용 할 수 있도록 필드를 주변에 배치 했습니다.\2
  • s명령은 처음 두 필드를 자신의 필드로 바꾸고 줄 바꿈 문자를 추가하며 새 줄에서 첫 번째 필드를 반복합니다. 따라서 선은 두 부분으로 나뉩니다. 1,a,b,c한 줄 1,a과 다른 줄1,b,c
  • 이제 P버퍼의 첫 번째 줄을 인쇄합니다(인쇄할 준비가 되었음을 알고 있습니다).
  • D버퍼에서 첫 번째 줄을 삭제하고, 삭제 후 버퍼에 남은 것이 있으면 스크립트를 다시 시작하세요. 따라서 나머지는 1,b,c다시 합계 행 1,b으로 나누어집니다 1,c.
  • 하나만 남으면 x,y패턴이 더 이상 일치하지 않으므로 개행이 삽입되지 않고 sed반복되지 않지만 다음 줄에서 계속됩니다.

답변3

밀러 사용(https://github.com/johnkerl/miller)

mlr --c2n --ofs "," --implicit-csv-header then reshape -r "[^1]" -o item,value then cut -x -f item input.txt

당신은 출력을 얻을 것이다

1,a
1,b
1,c
2,b
2,c
3,e
3,f
4,l

답변4

다음 명령을 사용해보십시오. 훌륭하게 작동합니다.

count_line=`awk '{print NR}' p.txt| sort -nr| sed -n '1p'`
for((i=1;i<=$count_line;i++)); do j=`awk -v i="$i" -F "," 'NR==i{print $1}' p.txt`;k=`awk -v i="$i" -F "," 'NR==i{print NF}' p.txt`; for ((z=2;z<=$k;z++)); do awk -v i="$i" -v j="$j" -v z="$z" -F "," 'NR==i{print j","$z}' p.txt; done; done

산출

1,a
1,b
1,c
2,b
2,c
3,e
3,f
4,l

관련 정보