У меня есть несколько файлов что-то вроде: (на самом деле у меня есть 80)
file1.dat
2 5
6 9
7 1
file2.dat
3 7
8 4
1 3
Я хочу в итоге файл, содержащий все вторые строки. т.е.
output.dat
6 9
8 4
То, что у меня есть, зацикливается на имена файлов, но затем перезаписывает файл перед ним. например, вывод вышеуказанных файлов будет просто
8 4
мой сценарий оболочки выглядит так:
post.sh
TEND = 80
TINDX = 0
while [ $TINDX - lt $TEND]; do
awk '{ print NR==2 "input-$TINDX.dat > output.dat
TINDX = $((TINDX+1))
done
awk 'FNR==2' file{1..80}.dat > output.dat
Как насчет ...
head -n 2 input.dat | tail -n 1 | awk
...источник
head
/tail
это определенно вариант, вам не нужноawk
тогда.sed
будет достаточно:-s
Опция необходима для печати 2-й строки из каждого файла, в противном случае будет напечатана только 2-я строка первого файла.источник
Решение от aragaer самое хорошее
sed
, да. Но так как мне очень нравитсяhead|tail
резать, у меня естьhead|tail
решение, которое поддерживает несколько файлов, а не одинinput.dat
. Использование цикла for вместо передачи списка файлов в sed также упрощает другие действия с файлом до / после извлечения второй строки с помощью sed.Многострочная версия с большим количеством комментариев:
NB: код ниже будет работать. Мы свободны поставить разрыв строки после
|
,&&
или||
, и продолжить нашу команду на следующей строке; мы можем даже поместить комментарии между ними. Я провел годы, не зная этого (и не видя этого нигде). Этот стиль менее полезен в интерактивном режиме, но очищает файлы сценариев без конца.источник
Очевидно, есть много способов сделать это - я думаю, мне больше всего нравится ответ @ aragaer's sed .
Вот тот, который использует чисто встроенные bash и не нуждается в форке каких-либо внешних утилит:
источник
Для эффективности использования
awk
иsed
в ответах здесь на нескольких файлах лучше использоватьnextfile
оператор для пропуска обработки нежелательных строк вawk
.и с помощью
sed
мы можем выйти при обработке на 3- й строке иsed
обработать следующий файл.источник