CSV 파일에서 일치하는 패턴만 인쇄하려고 합니다. 예: 로 시작하는 모든 열 값 35=its value
. 감사해요.
CSV 파일:
35=A,D=35,C=129,ff=136
D=35,35=BCD,C=129,ff=136
900035=G,D=35,C=129,ff=136
35=EF,D=35,C=129,ff=136,35=G
36=o,D=35,k=1
산출:
35=A
35=BCD
35=EF
35=G
내가 사용한 명령이 작동하지 않습니다.
sed -n '/35=[A-Z]*?/ s/.*\(35=[A-Z]*?\).*/\1/p' filename
답변1
tr
모든 쉼표를 개행 문자로 바꾼 다음 grep
문자열로 시작하는 모든 줄을 가져오는 데 사용됩니다 35=
.
$ tr ',' '\n' <data.in | grep '^35='
35=A
35=BCD
35=EF
35=G
답변2
일치하는 문자열만 각각 한 줄에 인쇄하는 옵션을 GNU grep
지원하려면 이를 사용합니다 .-o
$ grep -oE '\b35=[^,]+' ip.csv
35=A
35=BCD
35=EF
35=G
\b
단어 경계이므로900035
일치하지 않습니다.[^,]+
하나 이상의 비,
문자 일치- 값에 다음이 포함되지 않은 것으로 가정
,
그리고awk
$ awk -F, '{ for(i=1;i<=NF;i++){if($i~/^35=/) print $i} }' ip.csv
35=A
35=BCD
35=EF
35=G
-F,
,
입력 필드 구분자로 설정for(i=1;i<=NF;i++)
모든 필드에 걸쳐 반복if($i~/^35=/)
필드가 다음으로 시작하는 경우35=
print $i
이 필드를 인쇄하세요
비슷하다perl
perl -F, -lane 'foreach (@F){print if /^35=/}' ip.csv
답변3
펄 사용:
$ perl -lne 'print for /(\b35=[^,]+)/g' filename
35=A
35=BCD
35=EF
35=G
아니면 더 일반적으로/강하게 사용할 수도 있습니다.텍스트::CSV 모듈
$ perl -MText::CSV -lne '
BEGIN{$p = Text::CSV->new()}
print for grep { /^35=/ } $p->fields(), $p->parse($_)
' filename
35=A
35=BCD
35=EF
35=G
답변4
순수 Bash 솔루션:
( # Use parentheses as scope for IFS
IFS=$',\n' # Split on both , or \n
for c in $(</tmp/file.csv) # For every column or row
do
[[ "$c" =~ ^35= ]] && echo ${line##35=} # Find ^35= and print while removing ^35=
done
) # Optionally >/tmp/filtered-output.txt
노트,가독성과 유연성을 위해서만 사용하십시오 - 읽을 수 있는 경우그렇지 않으면 다음 방법을 사용할 수 있습니다.
# Read | Replace | Find | Remove
cat /tmp/file.csv | tr ',' '\n' | grep '^35=' | sed 's/^35=//'
이것이 더 직관적이고 효율적입니다.
입력(/tmp/file.csv):
35=A,D=35,C=129,ff=136
D=35,35=BCD,C=129,ff=136
900035=G,D=35,C=129,ff=136
35=EF,D=35,C=129,ff=136,35=G
36=o,D=35,k=1
산출:
A
BCD
EF
G