내 파일 내용은 아래와 같으며 내 출력을 아래와 같이 변환하고 싶습니다.
입력하다
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
awk
2로 시작하는 필드를 사용하고 반복할 수 있습니다 .
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