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
다음과 같이 내부적으로 파이프로 사용할 수 있습니다 .grep
xargs
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'