XARGS의 각 반복 출력에서 ​​첫 번째 행을 건너뜁니다.

XARGS의 각 반복 출력에서 ​​첫 번째 행을 건너뜁니다.
cut -d, -f2 parsed_repayment.csv | uniq -d | xargs -n1  -I{} grep {} parsed_repayment.csv | wc -l

기본적으로 각 grep 명령의 첫 번째 일치 항목을 건너뛰고 파일에 쓰고 싶지만 xargs는 모든 출력을 병합합니다. 이를 달성하는 편리한 방법이 있습니까?

예를 들어 "개", "고양이", "말"이라는 단어 목록이 있다고 가정해 보겠습니다. grep을 사용하여 파일에서 세 단어를 모두 검색하고 싶습니다. 이제 파일에 각 단어에 대해 일치하는 2개의 줄이 포함되어 있다고 가정합니다.

dog l1
dog l2
cat l1
cat l2
horse l1
horse l2

내 예상 결과는 -

dog l2
cat l2
horse l2

검색된 각 단어에 대해 첫 번째 일치 항목을 건너뛰기를 원합니다. 또한 각 단어는 서로 다른 일치 횟수를 가질 수 있습니다.

grep 이후의 출력을 임시 파일에 쓴 다음 tail 명령을 사용하여 첫 번째 줄을 자르려고 시도했지만 xargs가 주어진 단어에 대한 모든 일치 항목을 함께 전달하므로 단일 단어의 첫 번째 일치 항목을 건너뛸 수 없습니다.

답변1

처럼 들린다XY 문제그리고 당신이 정말로 원하는 것은:

awk -F, '$2 == prev; {prev = $2}' < parsed_repayment.csv

즉, 두 번째 필드가 이전 행의 두 번째 필드와 동일한 행을 보고합니다.

실제로 원하는 답변이 아닌 질문에 대한 답변은 다음과 같습니다.

cut -d, -f2 parsed_repayment.csv |
  uniq -d |
  xargs sh -c '
    for i do
      grep -e "$i" parsed_repayment.csv | tail -n +2
    done' sh

그러나 몇 가지 주의 사항이 있습니다.

  • xargs매우 구체적인 입력 형식이 필요합니다. 두 번째 열의 값에 공백, 작은따옴표, 큰따옴표 또는 백슬래시가 포함되어 있으면 올바르게 작동하지 않습니다.
  • grep$i무엇을 해야할지 이해정규식. -F이 문자열은 줄의 어느 곳에서나 검색 .됩니다 .$grep존재하다두 번째 영역은 말할 것도 없습니다.정확히 똑같다두 번째 필드.

답변2

sed -e 1d다음과 같이 내부적으로 파이프로 사용할 수 있습니다 .grepxargs

xargs -n1 -I{} bash -c 'grep {} apt-installed |sed -e 1d'

그래서 결국:

cut -d, -f2 parsed_repayment.csv | uniq -d | xargs -n1 -I{} bash -c 'grep {} apt-installed |sed -e 1d' | wc -l

답변3

다음은 첫 번째 입력 줄을 파일에 쓰고 foo나머지를 에코합니다.

read line ; echo "$line" >> foo ; while read line ; do echo "$line" ; done 

테스트 예시는 다음과 같습니다.

seq 0 9 | ( read line ; echo "$line" > foo ; while read line ; do echo "$line" ; done ) 
cat foo

이제 grep에서 직접 실행하는 대신 위의 스니펫 xargs에 출력을 넣는 파이프라인을 실행합니다 . grep이렇게 하면 xargs모든 출력을 연결하는 문제가 해결됩니다.

전체 내용이 너무 길어서 조각을 쉘 스크립트에 넣는 것을 고려할 수 있습니다. 파일 이름을 제어하려는 경우.

편집하다

이는 건너뛴 항목을 파일에 쓰고 나머지 항목을 표준 출력에 기록한다고 가정하지만 아마도 제가 잘못 이해하고 있는 것 같습니다.

답변4

GNU Parallel을 사용하면 다음과 같습니다:

cut -d, -f2 parsed_repayment.csv | uniq -d |
  parallel 'grep {} parsed_repayment.csv | tail -n +2'

관련 정보