두 번째 중복 행을 편집하는 방법은 무엇입니까?

두 번째 중복 행을 편집하는 방법은 무엇입니까?

"색상이 아님"이 아닌 중복 행을 모두 찾아 두 번째 항목 끝에 "색상임"을 추가하는 방법을 찾고 있습니다.

이것이 diff -y제가 말하는 것입니다.

orginal file  - final resault

pink            pink
pink          | pink is a color
not a color     not a color
not a color     not a color 
violet          violet
violet        | violet is a color
not a color     not a color
not a color     not a color
orange          orange
orange        | orange is a color
not a color     not a color

답변1

방법:

awk '{print $0; if((getline nl) > 0){ print ($0!="not a color" && $0 == nl)? 
     nl=$0" is a color" : nl }}' file

산출:

pink
pink is a color
not a color
not a color
violet
violet is a color
not a color
not a color
orange
orange is a color
not a color

사용해도 돼'행 변수 가져오기'변수에 대한 awk 입력의 다음 레코드를 읽습니다.변하기 쉬운.

이것줄을 서다명령 반환1기록을 찾은 경우0파일의 끝을 만난 경우.

$0!="not a color" && $0 == nl- 현재 레코드가 not a color문자열이 아니고 연속된 2개의 행이 동일한 경우(반복)


함수를 사용하는 또 다른 방법( substr()키 뒤에 문자열을 삽입하면 "색상"의 처음 2자를 반복함):" is a color "

awk '{print $0; if((getline nl) > 0){ print ($0!="not a color" && $0 == nl)? 
     nl=substr($0,1,2)" is a color "substr($0,3) : nl }}' file

출력은 다음과 같습니다:

pink
pi is a color nk
not a color
not a color
violet
vi is a color olet
not a color
not a color
orange
or is a color ange
not a color

답변2

지금까지 제공된 정보에서:

sed 'N;s/^\([a-z]*\)\n\1$/& is a colour/;$! P;$! D' file

패턴을 [a-z]*필요에 맞게 조정해야 할 수도 있습니다. 물론 색상만 일치하는 것이 아니라 여기서는 모든 소문자 단어와 일치합니다.

설명: 각 행의 스크립트는 다음 행을 명령에 추가하므로 N항상 사이에 개행이 있는 연속 행이 있습니다. 그런 다음 s첫 번째 줄의 패턴을 \1개행 문자 뒤의 역참조로 사용하여 중복된 줄만 일치시킵니다. 이 경우 &전체 일치 항목이 대체 문자열에 삽입되고 지정된 텍스트가 두 번째 줄에 추가됩니다. 그런 다음 P첫 번째 개행 문자를 인쇄하고 D이 부분을 삭제하므로 두 번째 줄은 여전히 ​​다시 시작해야 합니다. $!마지막 줄을 제외한 모든 줄에 대해 이 명령을 실행하도록 하세요. 왜냐하면 마지막 줄의 경우 이 두 줄을 출력해야 하기 때문입니다. 기본적으로 이는 스크립트 끝에서 발생합니다.

테스트 입력:

pink
pink
not a colour
not a colour
orange
orange
not a colour
red
blue
blue

출력은 다음과 같습니다.

pink
pink is a colour
not a colour
not a colour
orange
orange is a colour
not a colour
red
blue
blue is a colour

답변3

sed -e '
   # not interested in empty lines or blank lines
   /^$/b
   /\S/!b

   N;                        # get the next line into pattern space
   /^\(.*\)\n\1$/!{P;D;};    # compare 2 in the pattern space as string eq
   /\nnot a color$/b;        # 2 EQUAL, they are "not a color" => NOP
   s/$/ is a color/;         # 2 EQUAL, but not "not a color" => suffix
' your_colors.file

답변4

awk '/Not a color/ { print } /pink|red|blue|red|orange/ { if( found[$1] ) { print $1, "is a color" } else { print $1; found[$1]=1 } }' /path/to/input

관련 정보