sed delete all besides first and last line of many files

La ​​forma moderna de verificar el estado del socket es

ss -tln.

Las opciones para el ss son t para tcp, l para escuchar, n para numérico. Puede canalizarlo agrep 80

1
31.03.2016, 20:36
3 ответа

Идеально, есть ниже версии только awk:

find . -type f -name \*.txt -printf "%f\0" | xargs -0 -I xxxx sed -ni '
 2 {
   $ {
     s/^[^;]*;[^;]*;[^;]*;[^;]*;\([^;]*\);\([^;]*\).*$/\1;\2/
     p
     q
   }
   s/^[^;]*;[^;]*;[^;]*;[^;]*;\([^;]*\).*$/\1/
   h
 }
 $ {
   s/^[^;]*;[^;]*;[^;]*;[^;]*;[^;]*;\([^;]*\).*$/\1/
   H
   x
   s/\n/;/
   p
 }' xxxx

Спасибо очень известному Sed - An Introduction and Tutorial by Bruce Barnett

Results:

$ cat stat01.txt
18910101;19860630
$ cat stat56.txt
18980101;19990630
$ cat stat87.txt
19010101;19661229

----


first version for reference

Основываясь на вашем вводе, я изобрел формат файла данных и скрипт sed для их работы.

Попробуйте:

$ find . -type f -name \*.txt -printf "%f\0" | xargs -0 -I xxxx sed -ni '
 2 {
   $ {
     s/^[^;]*;\([^;]*\);\([^;]*\).*$/\1;\2/
     p
     q
   }
   s/^[^;]*;\([^;]*\).*$/\1/
   p
 }
 $ {
   s/^[^;]*;[^;]*;\([^;]*\).*$/\1/
   p
 }' xxxx

Он удаляет первую строку, содержащую заголовки.

Он сохраняет только столбец 2 первой обнаруженной строки данных и столбец 3 последней строки данных файла.

Если файл содержит только одну строку данных, он сохраняется на одной строке столбца 2 и столбца 3.

Хехехе это странно, но мне было очень весело !!!

Файлы данных в текущем каталоге:

$ cat test01.txt
Name;Price;Amount;Description
Bread;2.1;3;healthy one
$ cat test02.txt
Name;Price;Amount;Description
Water;0.0;100;For life
Wine;10.3;1;Less than half a glass a day
$ cat test03.txt
Name;Price;Amount;Description
House;1000.0;1;home
Car;500.5;0;no need
Bike;10.3;5;Good for the planet and for me

Результаты:

$ cat test01.txt
2.1;3
$ cat test02.txt
0.0
1
$ cat test03.txt
1000.0
5

Пожалуйста, предоставьте 2 коротких файла данных содержимое и ожидаемый результат,и я изменю этот ответ.

2
29.04.2021, 00:16

Для этого вам понадобится цикл по файлам:

for file in *.txt; do
  lines=$(wc -l < "$file")
  if [ "$lines" -lt 3 ]; then
    echo "$file is short enough, not touching it."
  else
    # for testing, you can also use the -i option
    sed -n '1p;$p' "$file" > "$file.new"
  fi
done

Цикл необходим, если у вас есть файлы длиной всего в одну строку. С командой , заданной thrig , они появятся дважды (попробуйте echo 1 | sed -n '1p; $ p' ).

0
29.04.2021, 00:16

Gawk - гораздо лучший инструмент для этой задачи, чем sed. Повторение конвейера find-xargs оригинального подхода и использование той же номенклатуры выходных данных:

find . -type f -name \*.txt -printf "%f\0" | xargs -0 gawk -F\; '
    FNR==2  { von = $5 }
    ENDFILE { print von FS $6 > "cleaned" FILENAME }
'

Код стал намного проще, намного понятнее, и, несомненно, более удобным для сопровождения.

0
29.04.2021, 00:16

Теги

Похожие вопросы