Как использовать команду оболочки, чтобы только показать первый столбец и последний столбец в текстовом файле?

Попробуйте Установку LiveUSB в режиме изображения для выполнения Mageia 2 от USB.

31
10.04.2016, 06:21
6 ответов

Вы, вероятно, должны сделать это с sed - я бы в любом случае - но, просто потому, что никто еще не написал этот:

while IFS=\| read col1 cols
do  printf %10s%-s\\n "$col1 |" " ${cols##*|}"
done <<\INPUT
foo|dog|cat|mouse|lion|ox|tiger|bar
INPUT

OUTPUT

     foo | bar
1
27.01.2020, 19:37
[

] Почти готово. Просто поместите обе ссылки на колонки рядом друг с другом.[

] [
cat logfile | sed 's/|/ /' | awk '{print $1, $8}'
] [

]Также обратите внимание, что здесь вам не нужна []cat[].[

] [
sed 's/|/ /' logfile | awk '{print $1, $8}'
] [

]Также обратите внимание, что вы можете сказать []awk[], что разделители колонок это []|[], а не пустые, так что вам также не нужна []sed[]. [

] [
awk -F '|' '{print $1, $8}' logfile
] [
] [

]Согласно []предлагает [] по []Caleb[], если вам нужно решение, которое все еще выводит последнее поле, даже если их не совсем восемь, вы можете использовать []$NF[].[

] [
awk -F '|' '{print $1, $NF}' logfile
] [

]Также, если вы хотите, чтобы в выводе сохранялись разделители []|[], вместо того, чтобы использовать пробел, вы можете указать разделители полей вывода. К сожалению, это немного более неуклюже, чем просто использование флага []-F[], но вот три подхода.[

] [
    ] [
  • ][

    ]Вы можете назначить разделители полей ввода и вывода в самом []awk[], в блоке BEGIN.[

    ] [
    ][]awk 'BEGIN {FS = OFS = "|"}. {Печатать $1, $8}' logfile
    [][
    ][
  • ] [
  • ][

    ] Эти переменные можно назначить при вызове []awk[] из командной строки, через флаг []-v[].[

    ] [
    ][]awk -v 'FS=|' -v 'OFS=|' '{print $1, $8}' logfile
    [][
    ][
  • ] [
  • ][

    ] или просто: [

    ] [
    ][] awk -F '|' '{print $1 "|" $8}' logfile
    [][
    ][
  • ] [
]
54
27.01.2020, 19:37
[

] Вы все равно используете [] awk[]: [

] [
awk '{ print $1, $NF }' file
]
11
27.01.2020, 19:37
[

] Похоже, что вы пытаетесь получить первое и последнее текстовые поля, которые разделены полем []|[]. [

] [

]Я предположил, что ваш лог-файл содержит текст, подобный приведенному ниже,[

] [
foo|dog|cat|mouse|lion|ox|tiger|bar
bar|dog|cat|mouse|lion|ox|tiger|foo
] [

]И вы хотите, чтобы вывод был подобен,[

] [
foo bar
bar foo
] [

]Если да, то вот команда для вашего[

] [

]Through GNU sed,[

] [
sed -r 's~^([^|]*).*\|(.*)$~\1 \2~' file
] [

][]Пример:[][

] [
$ echo 'foo|dog|cat|mouse|lion|ox|tiger|bar' | sed -r 's~^([^|]*).*\|(.*)$~\1 \2~'
foo bar
]
2
27.01.2020, 19:37

Если вы обнаружите, что awk- и sed-less, вы можете добиться того же с помощью coreutils:

paste <(           cut -d'|' -f1  file) \ 
      <(rev file | cut -d'|' -f1 | rev)
4
27.01.2020, 19:37

Просто замените с первого до последнего | на | (или пробел, если хотите):

sed 's/|.*|/|/'

Обратите внимание, что, хотя не существует реализации sed , где | является специальным (пока расширенные регулярные выражения не включены через -E или - r в некоторых реализациях), \ | сам по себе является особенным в некоторых, таких как GNU sed . Таким образом, вы должны , а не escape | , если хотите, чтобы он соответствовал символу | .

Если заменить пробелом и если входные данные уже могут содержать строки только с одним | , тогда вам придется обрабатывать это специально как |. * | не будет совпадать по тех. Это может быть:

sed 's/|\(.*|\)\{0,1\}/ /'

(то есть сделать часть . * | необязательной) Или:

sed 's/|.*|/ /;s/|/ /'

или:

sed 's/\([^|]*\).*|/\1 /'

Если вы хотите первое и восьмое поля независимо от количества полей в input, тогда это просто:

cut -d'|' -f1,8


(все они будут работать с любой POSIX-совместимой утилитой, предполагая, что входные формы являются допустимым текстом (в частности, sed ), как правило, не будут работать, если входные данные содержат байты или последовательности байты, которые не образуют допустимые символы в текущей локали, например, printf 'unix | St \ 351phane | Chazelas \ n' | sed 's / |. * | / | /' в UTF- 8 локаль)).

12
27.01.2020, 19:37

Теги

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