У меня есть таблица, и я хочу извлечь строку в обратном порядке столбцов в сценарии оболочки [закрыто]

No. Хотя иметь гигабайты ОЗУ в наши дни — это фантастика, было время, когда ОЗУ было очень ограниченным ресурсом (я учился программированию на VAX 11/750 с 2 МБ ОЗУ), и единственной вещью в ОЗУ были активные исполняемые файлы и страницы данных активных процессов и файловых данных, которые находились в буферном кеше.
Буферный кеш был очищен, а страницы данных выгружены. И часто временами. Исполняемые страницы, доступные только для чтения, были перезаписаны, а таблицы страниц помечены, поэтому, если программа снова касалась этих страниц, они загружались из файловой системы. Данные были выгружены из свопа. Как было отмечено выше, библиотека STDIO подтягивала данные блоками и получала программой по мере необходимости: fgetc, fgets, fread и т.д. С помощью mmap файл может быть отображен в адресное пространство процесса, как это делается с объектами разделяемой библиотеки или даже с обычными файлами. Да, у вас может быть некоторая степень контроля над тем, находится он в ОЗУ или нет (mlock), но это не так далеко (см. раздел кода ошибки mlock).

0
19.02.2019, 17:07
6 ответов

Использование Perl:

perl -alne 'print reverse split /(\|)/'

(извините за путаницу)

или...

perl -alne 'print reverse /[|]|[^|]+/g'
3
28.01.2020, 02:18

Попробуйте это,

 awk -F '|' '{for (i=NF;i>0;i--){if (i!=1) printf $i"|"; else printf $i};printf "\n"}' file.csv

London|First|Hunk|1
London|Second|Hero|2
Pow|First|Will|3
Pow|Second|Thomas|4
Berlin|First|Venus|5

Для печати только последней строки

awk 'END{print}' file.csv | awk -F '|' '{for (i=NF;i>0;i--){if (i!=1) printf $i"|"; else printf $i};printf "\n"}' 
1
28.01.2020, 02:18
cat filename | sed -r 's/(.*)\|(.*)\|(.*)\|(.*)/\4\|\3\|\2\|\1/g' > output.file

Теперь, если вы проверите свой выходной файл, вы увидите желаемый результат.

-1
28.01.2020, 02:18

Выполнено командой ниже

 k=`awk '{print NR}' u.txt | sed -n '$p' `
z=`awk -F "|" '{print NF}' u.txt | sort |uniq`
praveen@praveen:~$ for ((i=1;i<=k;i++)); do for ((j=$z;j>=1;j--)); do awk -v i="$i" -v j="$j" -F "|" 'NR==i{print $j}' u.txt ; done| perl -pne "s/\n/ /g"| awk '{print $0"\n"}'|sed -r "s/\s+/|/g"| sed "s/|$//g"; done| sed '/^$/d'

выход

k=`awk '{print NR}' u.txt | sed -n '$p' `
z=`awk -F "|" '{print NF}' u.txt | sort |uniq`
for ((i=1;i<=k;i++)); do for ((j=$z;j>=1;j--)); do awk -v i="$i" -v j="$j" -F "|" 'NR==i{print $j}' u.txt ; done| perl -pne "s/\n/ /g"| awk '{print $0"\n"}'|sed -r "s/\s+/|/g"| sed "s/|$//g"; done| sed '/^$/d'

London|First|Hunk|1
London|Second|Hero|2
Pow|First|Will|3
Pow|Second|Thomas|4
Berlin|First|Venus|5
0
28.01.2020, 02:18

Извините, нет awk.

$ paste -d\| <(cut -d\| -f4 file) <(cut -d\| -f3 file) <(cut -d\| -f2 file) <(cut -d\| -f1 file)
London|First|Hunk|1
London|Second|Hero|2
Pow|First|Will|3
Pow|Second|Thomas|4
Berlin|First|Venus|5
$ sed -E 's/(.*)\|(.*\|)(.*\|)(.*)/\4|\3\2\1/' file
London|First|Hunk|1
London|Second|Hero|2
Pow|First|Will|3
Pow|Second|Thomas|4
Berlin|First|Venus|5
0
28.01.2020, 02:18

Или вы можете направить вывод своей таблицы в sed

$ cat filename | sed -r 's/(.*)\|(.*)\|(.*)\|(.*)/\4\|\3\|\2\|\1/g'
1
28.01.2020, 02:18

Теги

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