문자열을 찾아 해당 줄의 첫 번째 문자와 마지막 문자를 인쇄합니다.

문자열을 찾아 해당 줄의 첫 번째 문자와 마지막 문자를 인쇄합니다.

다양한 길이의 수백 줄의 파일이 있습니다. "New"라는 문자열이 포함된 각 줄을 찾아 처음 7자와 마지막 문자 뒤의 10번째 문자를 인쇄하고 싶습니다.

예를 들어, cat file1.txt

1234567 New line with irrelevant info x end line
2345678 irrelevant line
3456789 New line with different irrelevant info y end line
4567890 irrelevant line
5678901 New line with yet more irrelevant info z end line

내 결과는 다음과 같습니다

1234567 x 
3456789 y
5678901 z

답변1

POSIX적으로:

이 줄에는 최소 10자가 포함되어 있다고 가정합니다(그렇지 않은 경우 두 번째 줄의 동작은 지정되지 않으며 뒤에 또는 substr()추가하여 10자 또는 17자 미만의 줄을 건너뛸 수 있습니다).&& length >= 10&& length >= 17/New/

awk '/New/ {print substr($0, 1, 7), substr($0, length - 9, 1)}'

또는 줄에 17자 이상이 포함되어 있다고 가정합니다(그렇지 않은 줄은 건너뜁니다).

sed -n '/New/ s/^\(.\{7\}\).*\(.\).\{9\}$/\1 \2/p'

답변2

원하는 것을 선택하세요:

awk해결책:

awk '/New/{ print substr($0, 1, 7), substr($0, length-9, 1) }' file1.txt

sed해결책:

sed -rn '/New/ s/^(.{7}).*(.).{9}$/\1 \2/p' file1.txt

출력 예(두 방법 모두):

1234567 x
3456789 y
5678901 z

답변3

gawknull이는 필드 구분 기호 FS와 출력 필드 구분 기호를 사용하여 작업을 수행하는 "잔인한" 솔루션입니다. OFS이는 입력 파일의 모든 문자가 awk의 필드로 처리됨을 의미합니다.

awk '/New/{print $1,$2,$3,$4,$5,$6,$7," ",$(NF-9)}' FS="" OFS="" file1
1234567 x
3456789 y
5678901 z

grep/sed를 사용하는 더 많은 솔루션이 이어질 것입니다.

답변4

다양성을 위해 bash 솔루션만 사용됩니다. 파일의 여러 줄을 처리할 때 일반적으로 sed와 awk가 더 나은 도구이지만 bash가 작업을 완료할 수 있습니다. 여기서 스트링 슬라이스 변수 확장은 매우 편리합니다.

while IFS= read -r line
do
  # Check the line length.
  # This could be whatever test defines an irrelevant line.
  if [ "${#line}" -lt "25" ]
  then
    continue
  fi

  printf '%s\n' "${line:0:7} ${line: -10:1}"
done < file1.txt

산출

1234567 x
3456789 y
5678901 z

관련 정보