여러 파일의 마지막 줄에서 두 번째 줄을 하나의 파일로 인쇄하는 방법은 무엇입니까? [복사]

여러 파일의 마지막 줄에서 두 번째 줄을 하나의 파일로 인쇄하는 방법은 무엇입니까? [복사]

디렉터리에 다양한 길이의 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에서만 작동 하지만 불행히도 작동합니다 .busyboxbusybox 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

젠장.

관련 정보