다양한 길이의 수백 줄의 파일이 있습니다. "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
gawk
null
이는 필드 구분 기호 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