다음 awk
명령문과 그 출력을 고려하십시오.
$ awk -F "/" '/\/tcp/ {print $1}' input_file
10\n
20\n
내가 원하는 출력은 다음과 같습니다.
10,20
내가 시도한 것은 다음과 같습니다.
$ awk -F "/" 'BEGIN{ORS=","} /\/tcp/ {print $1}' input_file
10,20,
마지막에 쉼표를 제거하는 방법은 무엇입니까?
답변1
ORS를 로 설정하지 마십시오. ,
그러면 스크립트의 출력이 줄 바꿈으로 끝나지 않으므로 POSIX에 따라 유효한 텍스트 파일이 아니므로 이를 사용하여 호출하는 다른 스크립트와 동일한 작업을 수행합니다. 대신, 플랫폼이 가져야 하는 모든 값을 보유하도록 ORS를 그대로 두고 ,
출력하려는 모든 문자열 앞에 첫 번째 문자열을 제외한 모든 문자열을 인쇄합니다.
awk -F '/' '/\/tcp/{printf "%s%s", sep, $1; sep=","} END{print ""}'
예를 들어:
$ seq 3 | awk '{printf "%s%s", sep, $0; sep=","} END{print ""}'
1,2,3
답변2
개인적으로 저는 인쇄 후에 쉼표를 제거하겠습니다.
awk -F "/" 'BEGIN{ORS=","}/\/tcp/ {print $1}' | sed 's/,$//'
또는 후행 줄바꿈을 추가하세요.
awk -F "/" 'BEGIN{ORS=","}/\/tcp/ {print $1}' | sed 's/,$/\n/'
정말로 이 작업을 에서 수행하려면 awk
다소 우아하지 않은 다음 접근 방식을 시도해 볼 수 있습니다.
awk -F "/" '/\/tcp/{ if(NR == 1){ printf "%s", $1} else{ printf ",%s",$1}}'
그리고 후행 줄 바꿈을 추가하려면 다음을 수행하십시오.
awk -F "/" '/\/tcp/{ if(NR == 1){ printf "%s", $1} else{ printf ",%s",$1}}END{print ""}'
답변3
무응답은 awk
질문이 설명된 것처럼 간단하다고 가정합니다.
paste -s -d',' input_file
-s, --serial
파일을 순차적으로 처리함을 나타냅니다( paste
보통 여러 파일의 줄을 병합하는 데 사용됨).
-d, --delimiters
구분 기호 지정(기본값은 탭)
답변4
당신이 하고 있는 일은 수집된 데이터의 여러 행을 기반으로 단일 출력 레코드를 구축하는 것입니다. 그럼 이렇게 해보자:
awk -F '/' '
BEGIN { OFS = "," }
/\/tcp/ { a[++n] = $1 }
END {
$0 = ""
for (i = 1; i <= n; ++i)
$i = a[i]
print
}' input_file
이는 데이터를 배열로 수집 a
하고 END
해당 배열의 필드를 사용하여 블록에 새 레코드를 작성합니다. 존재하다매우마지막으로 기록을 인쇄합니다. OFS
블록에 쉼표를 설정하므로 필드는 쉼표로 구분 됩니다 BEGIN
.
시험:
$ awk -F '/' 'BEGIN {OFS=","} /\/tcp/ {a[++n]=$1} END {$0="";for (i=1;i<=n;++i) $i = a[i];print}' <<END_INPUT
first/tcp
no relevant
second/tcp
third/tcp
END_INPUT
first,second,third
(위의 마지막 줄은 출력이고, 입력은 여기에서 로 구분된 문서를 통해 제공됩니다 END_INPUT
.)