파일( 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;
for
if
하지만 한 줄에 awk
or 또는 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