Awk-다음 줄의 길이를 줄에 기록

Aug 27 2020

교대 줄로 구성된 텍스트 파일을 가정합니다. 특히, 각 라인 쌍의 라인 1은 "#"로 시작하는 반면 각 라인 쌍의 후속 라인에는 영숫자 문자열이 포함됩니다.

$ cat file
#Foo
1234567
#Bar
1234
#Baz
123456789

줄 2의 길이 (키워드 포함)를 각 줄 쌍의 줄 1에 자동으로 추가하려면 어떻게해야합니까? 나는 그것이 awk그러한 수술을위한 올바른 선택 이라고 믿습니다 .

$ awk 'desired code' file
#Foo_Length7
1234567
#Bar_Length4
1234
#Baz_Length9
123456789

여기 내 시도가 있지만 무엇을 대체 해야할지 모르겠습니다 length($0).

awk '{if ($1~/^#/) print $0"_Length"length($0); else print $0}' file

답변

3 EdMorton Aug 27 2020 at 02:29
$ awk '!(NR%2){print prev "_Length" length($0) ORS $0} {prev=$0}' file
#Foo_Length7
1234567
#Bar_Length4
1234
#Baz_Length9
123456789

당신은 대체 할 수 !(NR%2)로 !/^#/또는 원하는 경우 유사한.

2 Cyrus Aug 27 2020 at 02:25

GNU awk 사용 :

awk '{first=$0; getline; print first "_length" length($0); print}' file

산출:

# Foo_length7
1234567
# Bar_length4
1234
# Baz_length9
123456789

에서 man awk:

getline: 다음 입력 레코드에서 $ 0을 설정합니다. NF, NR, FNR, RT를 설정합니다.

1 RavinderSingh13 Aug 27 2020 at 02:39

다음을 시도해 주시겠습니까? 여기에 tac+ awk조합을 사용 합니다. 모바일로 작성된 테스트는 아직 작동하지 않습니다.

tac Input_file | 
awk '
NR%2!=0{
  len=length($0) print next } { print $0"_Length"len
  len=""
}' | 
tac

설명 : 먼저tac데이터 조작을 쉽게 처리 할 수 ​​있도록 출력을 반대로 인쇄하는 데 사용합니다. 그런 다음 홀수 줄마다 awk를 인쇄하고 길이를 len 변수로 가져옵니다. 그런 다음 모든 짝수 줄에서 이전 줄의 길이로 현재 줄을 인쇄합니다. awk가 처리를 마치면 다시 tac을 사용하여 Input_file을 반전하여 실제 형식으로 만듭니다.