Команда для получения первых 5 и последних 10 символов строки

С помощью sed :

sed -e 's/\(I|\)[^|]*$/\10758000/;s/\(A|\)[^|]*$/\10800000/' file1.txt

Смысл в том, чтобы s убрать все, что идет после I | или A | (т.е. последний столбец) с желаемыми номерами.

Результат:

Z89|EEE333333|100001|JANMC84|19990101|I|0758000
Z89|EEE444444|200001|JANMC84|19990101|I|0758000
Z89|EEE222222|300001|JANMC84|19990101|A|0800000
Z89|EEE555555|700001|JANMC84|19990101|A|0800000
1
22.02.2018, 21:11
5 ответов

Puede introducir la línea en Perl, así:

$ printf "%s" {a..z} | perl -nlE'say substr($_,0,5). substr($_,-10)'
abcdeqrstuvwxyz
0
27.01.2020, 23:12

No estoy muy seguro de lo que quieres hacer aquí, pero con

foo="postgres 3625 1 0 Jan31 ? 00:00:35 /opt/rh/rh-postgresql95/root/usr/bin/postgres -D /var/opt/rh/rh-postgresql95/lib/pgsql/data"

puede usar la funcionalidad estándar bashpara ejecutar

$ echo ${foo:0:5}
postg
$ echo ${foo: -10:10}
pgsql/data
$ echo ${foo:0:5} ${foo: -10:10}
postg pgsql/data
$ echo ${foo:0:5}${foo: -10:10}
postgpgsql/data

El desplazamiento negativo en la segunda declaración significa "comenzar por el final".

5
27.01.2020, 23:12

Usandosed:

sed -E 's/(.{5}).*(.{10})$/\1\2/' infile

O use cutywc(si solo hay una línea como entrada o todas las líneas tienen la misma longitud):

cut -c1-5,$(($(wc -c <infile)-10))- <infile
2
27.01.2020, 23:12

Так же для пополнения коллекции подходит командная -строка:

s="postgres  3625     1  0 Jan31 ?        00:00:35 /opt/rh/rh-postgresql95/root/usr/bin/postgres -D /var/opt/rh/rh-postgresql95/lib/pgsql/data"

grepподход:

echo $(printf "%s" $(grep -Eo '^.{5}|.{10}$' <<<"$s"))
postgpgsql/data

awkподход:

awk '{ print substr($0,1,5) substr($0, length-9) }' <<<"$s"
postgpgsql/data
1
27.01.2020, 23:12

Другой подход с colrm и wc

start=5
end=10
s='postgres  3625     1  0 Jan31 ?        00:00:35 /opt/rh/rh-postgresql95/root/usr/bin/postgres -D /var/opt/rh/rh-postgresql95/lib/pgsql/data'
# with dash
printf "%s\n" "$s" | colrm $start $(($(printf "%s\n" "$s" | wc -c)-$end))
# with bash
# <<<$s colrm $start $(($(wc -c <<<$s)-$end))
0
27.01.2020, 23:12

Теги

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