구분 기호 기반 값으로 첫 번째 필드를 인쇄하는 방법

구분 기호 기반 값으로 첫 번째 필드를 인쇄하는 방법

파일( myfile.txt)에는 다음 데이터가 포함되어 있습니다.

abc#ab1=23
nrt#
#clb1aX
amd#322

원하는 출력:

abc
nrt
clb1ax
amd

나는 이것을 할 수 있다

for i in `cat myfile.txt` 
do 
  s1=`echo $i | cut -d'#' -f1`; 
  s2=`echo $i | cut -d'#' -f2`; 
  if [ "$s1" == "" ]; then 
    echo "$s2" 
  else
    echo "$s1"
  fi;
done;

forif하지만 한 줄에 awkor 또는 sed무언가를 사용하는 것처럼 and를 사용하지 않고 이 작업을 수행할 수 있는 방법이 있습니까 ?cut

답변1

짧은awk해결책:

awk -F'#' 'NF{ print ($1 != "" ? $1 : $2) }' file

산출:

abc
nrt
clb1aX
amd

답변2

답변

sed -i "/^#/ { s/#\(.*\)/\1/; b }
        s/#.*//" myfile.txt

;를 추가 하여 한 줄로 연결할 수 있지만 }읽기가 더 어려워집니다.

설명하다

sed -i파일의 변경 사항을 유지하고 쓰지 마십시오 stdout.

/^#/- sed로 시작하는 줄에 있을 때 #.

s/#\(.*\)/\1/- 첫 번째 항목을 #[everything]로 바꿉니다 [everything].

b- 현재 라인의 작업을 중지하고 다음 라인의 작업을 시작합니다.
( s/#.*//명령 실행을 방지합니다.)

s/#.*//- 첫 번째 항목을 삭제합니다 #[everything].
(이전 b명령이 일찍 종료되지 않는 한 모든 줄에 적용됩니다.)

myfile.txt실행할 파일입니다 sed.

답변3

값이 있는 필드가 없거나 두 번째 열에만 없으면 어떻게 됩니까? 그러면 필요할 것입니다.

awk -F'#' '{for(i=1; i<=NF; i++) if ($i != "") {print $i; break} }' infile

다음 예를 보면:

ABC#asd=123
노트#
#clsdX
####
###여기
ACN#123

출력은 다음과 같습니다.

abc
nrt
clsdX
here
acn

또는 sed다음을 사용하십시오 cut.

cut -d'#' -f1 <(sed 's/^#\+//; /^$/d' infile )
  • s/^#\+//선행 해시 값 제거 #(1회 이상 발생)
  • /^$/d위 이후에 생성된 빈 줄(한 줄이 모두 hashes 인 경우)을 제거 #####하거나, 파일에 빈 줄이 있는 경우 제거합니다.
  • 파일이 해시로 구분된 경우 cut -d'#' -f1첫 번째 필드 인쇄-f1-d'#'

아니면 sed그냥:

sed 's/^#\+//; /^$/d; s/^\([^#]*\)#.*/\1/' infile
  • 이는 s/^\([^#]*\)#.*/\1/요청 라인에서 시작하여 첫 번째 해시가 나타날 때까지 일치 집합을 캡처한 다음 결과에 인쇄하고 나머지는 무시합니다.

답변4

다른 sed

sed 's/^#*\([^#]*\).*/\1/' infile

행을 삭제하려면 ####을 사용하세요.

sed 's/^#*\([^#]*\).*/\1/;/^$/d' infile

관련 정보