특정 "문자열"을 찾고 전체 줄을 인쇄하려면 어떻게 해야 합니까?

특정 "문자열"을 찾고 전체 줄을 인쇄하려면 어떻게 해야 합니까?

myfile.csv다음 내용의 파일이 있습니다 .

 abc:123:myname:1231
 def:423324:arbitrary:value:string
 StackExchange:Unix:Linux

내가 실행하는 터미널에서./myscript.sh def

내용은 myscript.sh다음과 같습니다:

#!/bin/bash
key_word_I_am_looking_for=$1
my_variable=`cat myfile.csv | awk -F: -v keyword="$key_word_I_am_looking_for" '( $1 == keyword )' END{print "$@" }'`
echo "$my_variable"

코드 defmyfile.csvIE abc또는 StackExchange.my_variabledef 423324 arbitrary value string./myscript.sh def./myscript.sh StackExchange출력은 StackExchange Unix Linux)이 됩니다.

내가 어디서 잘못됐나요? 다른 옵션이 있나요?

답변1

awk 구문이 약간 잘못되었습니다.

#!/bin/bash
awk -F: -v keyword="$1" '$1 == keyword {$1=$1; print}' myfile.csv

여기서의 비결은 필드 중 하나의 값을 다시 할당하여 awk가 출력 파일 구분 기호를 사용하여 $0를 다시 계산하도록 하는 것입니다. 여기서 기본 OFS는 공백이므로 $1 값을 자체에 할당하면 콜론이 공백으로 변경됩니다.

그것을 작성하는 비익적인 방법은 다음과 같습니다:

grep "^$1:" myfile.csv | tr ":" " "

그러나 이것은 문자열 평등이 아닌 정규식 일치를 사용합니다.

답변2

대안은 다음 과 같습니다 sed.

sed -n '/^def:/s/:/ /gp' myfile.csv

문자열을 첫 번째 위치 인수로 전달하는 경우:

sed -n "/^$1:/s/:/ /gp" myfile.csv

답변3

파이썬으로.

$ python -c "import sys;
with open(sys.argv[2]) as f:
    for line in f:
        if sys.argv[1] == line.split(':')[0]:
            print ' '.join(line.strip().split(':'))" def file
def 423324 arbitrary value string

터미널에서 위 스크립트를 실행하고 검색 키워드를 첫 번째 인수로, 파일 이름을 두 번째 인수로 전달하면 됩니다.

답변4

Raku(이전 Perl_6) 사용

raku -ne '.put if .=split(":")[0] eq "def";' myfile.csv

산출:

def 423324 arbitrary value string

언어 참고 사항: Perl 언어 계열은 "주제" 변수 개념을 활용합니다. Raku는 이 개념을 확장하고 표준화합니다(아래 Rosetta 코드 링크 참조). 이제 루틴은 기본적으로 $_테마 변수를 사용하므로 작업을 표시하는 데 선행 마침표만 필요합니다.존재하다주제 $_변수. 위의 코드를 "손으로 직접 작성"하면 실제로 다음과 같은 결과를 얻을 수 있습니다.

raku -ne '$_.put if $_.=split(":")[0] eq "def";'

마지막으로 Raku가 제안합니다..= 이진 할당=lvalue를 업데이트하려면 기본적으로 (등호)만 삽입하면 되는 연산자 입니다. 따라서 코드를 .shorter my $temp = $_.fn(…); $_ = $temp;로 압축할 수 있으며 임시 변수를 $_.=fn(…) 만들 필요가 없습니다 !$temp

https://rosettacode.org/wiki/Topic_variable#Raku
https://docs.raku.org/routine/.=
https://raku.org/

관련 정보