쉘 명령을 사용하여 각 줄을 복사하는 방법은 무엇입니까?

쉘 명령을 사용하여 각 줄을 복사하는 방법은 무엇입니까?

다음과 같은 많은 데이터가 있습니다.

1,A9600,001_DIF,NA,TIME,startTime    
2,A9600,002_DEP,NA,TIME,startTime
3,A9600,003_LIT,NA,TIME,startTime
4,A9600,004_ETC,NA,TIME,startTime
5,B9600,005_CMP,NA,TIME,startTime
6,B9600,006_IMP,NA,TIME,startTime
7,B9600,007_DIF,NA,TIME,startTime

다음과 같이 수정하고 싶습니다.

1,A9600,001_DIF,NA,TIME,startTime
1,A9600_1,001_DIF,NA,TIME,startTime
1,A9600_2,001_DIF,NA,TIME,startTime
1,A9600_3,001_DIF,NA,TIME,startTime  
2,A9600,002_DEP,NA,TIME,startTime
2,A9600_1,002_DEP,NA,TIME,startTime
2,A9600_2,002_DEP,NA,TIME,startTime
2,A9600_3,002_DEP,NA,TIME,startTime
....

쉘 명령을 사용하여 이를 어떻게 달성할 수 있습니까?

답변1

간단한 awk 루프

awk -v num=3 'BEGIN {OFS=FS=","} 
  {tmp=$2; print; for (i=1;i<=num;i++) {$2=tmp"_"i; print}}
  ' file

num필요에 따라 조정하십시오.

답변2

따라서 기본적으로 두 번째 필드 다음에 다른 접미사를 사용하여 각 행을 4번 반복하고 싶습니까?

sed 'p;s/,/_1,/2p;s/_1/_2/p;s/_2/_3/' file

이것은 행을 있는 그대로 인쇄합니다. 첫 번째 명령은 p두 번째 쉼표 앞에 s추가하고 _1두 번째와 세 번째는 and s로 대체하고 , 두 번째 명령은 행을 인쇄하기 위해 플래그를 착용하고, 마지막 버전은 기본적으로 인쇄합니다._2_3p

질문을 확장한 후 수정

주어진 반복 횟수만큼 반복하려면 다음을 수행하십시오.

sed 'p;s/,/_1,/2p;G;s/$/0123456789+/;:a
s/\(_[0-9]*\)\([0-9]\)\(,.*\n.*\2\)\(.\)/\1\4\3\4/
s/_+/_10/;s/\(_[0-9]*\)\([0-9]\)+\(.*\n.*\2\)\(.\)/\1\40\3\2\4/
/_+/!P
/_123,/! ta
d' file

마지막에서 두 123번째 행이 최대 인덱스입니다. 지금은 설명할 시간이 없지만, 무슨 일인지 이해하고 싶다면 나중에 설명해 드리겠습니다.

답변3

perl -pse '$l = $_;
   for my $k ( 1 .. $N ) { s/\z/$l =~ s|^[^,]+,[^,]+\K|_$k|r/e }
' -- -N=3 -- Input.data

피복재

  • -p옵션은 암시적 파일 루프 읽기 + 레코드 자동 인쇄를 설정합니다.
  • -s우리의 경우 명령줄에서 변수를 설정할 수 있습니다 $N. YMMV.
  • 현재 레코드를 $l에 저장합니다.
  • 두 번째 쉼표가 발견된 $l의 수정된 내용을 현재 레코드에 반복하고 추가합니다.

관련 정보