디렉터리에 다양한 길이의 CSV 파일이 많이 있습니다. 각 파일의 마지막 줄에서 두 번째 줄을 파일에 넣고 싶습니다. 나는 비슷한 것을 시도한 tail -2 * | head -1 > file.txt
다음 왜 이것이 작동하지 않는지 깨달았습니다.
저는 BusyBox v1.19.4를 사용하고 있습니다.
편집: 다른 질문과 유사점이 있지만 여러 파일을 읽는다는 점에서 다릅니다. Tom Hunter의 답변에 있는 루프 for
는 제가 필요했지만 이전에는 생각하지 못했던 것입니다.
답변1
for i in *; do tail -2 "$i" | head -1; done >>file.txt
이것은 Busybox와 호환되어야 sh
하지만 테스트할 비 bash ATM이 없습니다.
유용한 의견을 바탕으로 편집되었습니다.
답변2
GNU 또는 BSD 사용 sed
:
sed -s 'x;$!d' -- files... >outfile
...예를 들어:
for i in 10 50 100 1000
do seq "$i" >file"$i"
done
sed -s 'x;$!d' -- file[15]0*
9
99
999
49
다음을 사용하여 이 작업을 수행 할 tail
수도 있습니다.
tail -n2 file[15]0* | sed -ne'n;p;n;n'
9
99
999
49
...하지만 당신은 필요합니다틀림없이이 경우 스트림이 분리 sed
되지 않고 -s
일회성이 나머지 출력에 영향을 미치기 때문에 각 내부 파일에는 최소한 두 줄이 있어야 합니다. 하지만 tail
아무것도 인쇄되지 않습니다.더각 파일의 마지막 두 줄보다 각 그룹 뒤에 빈 줄이 있고 각 그룹은 표준 파일 이름 헤더로 시작됩니다.(실제로 파일 이름에 줄 바꿈이 있으면 문제가 발생할 수 있습니다.).
tail
인쇄된 내용 은 다음과 같습니다 .
tail -n2 file[15]0*
==> file10 <==
9
10
==> file100 <==
99
100
==> file1000 <==
999
1000
==> file50 <==
49
50
...더 나은 옵션이 없다면 스트림을 처리하는 것이 그리 어렵지 않습니다.
그리고 만약 있다면 그것에 대해 생각해 보세요예파일에 두 줄 미만이 있으면 sed
솔루션은 파일에 대해 빈 줄을 출력합니다. 파일에 아무 것도 쓰지 않으려면 다음을 수행하십시오.
sed -s 'x;$!d;1d' -- file[15]0*
...그리고 그게 다야.
이 명령은 내장 명령 tail | sed
에서만 작동 하지만 불행히도 작동합니다 .busybox
busybox sed
아니요분할 스트림 옵션을 처리합니다 -s
. 적어도 내 빌드는 다음을 수행하지 않습니다.
busybox sed --help
BusyBox v1.21.1 (2013-07-28 11:02:27 EDT) multi-call binary.
Usage: sed [-inr] [-f FILE]... [-e CMD]... [FILE]...
or: sed [-inr] CMD [FILE]...
당황스럽기는 마찬가지다.toybox sed
(나는 그것을 선호하며 공식적으로 안드로이드에 포함되어 있습니다)잘못 보고한 것하다출력에서 옵션을 지원하고 --help
다른 곳에서는 이를 인식하지 않습니다.
toybox sed -s -e 'x;$!d' -- file[15]0*
usage: sed [-inrE] [-e SCRIPT]...|SCRIPT [-f SCRIPT_FILE]... [FILE...]
Stream editor. Apply one or more editing SCRIPTs to each line of input
(from FILE or stdin) producing output (by default to stdout).
-e add SCRIPT to list
-f add contents of SCRIPT_FILE to list
-i Edit each file in place.
-n No default output. (Use the p command to output matched lines.)
-r Use extended regular expression syntax.
-E Alias for -r.
-s Treat input files separately (implied by -i)
...
sed: Unknown option s
젠장.