Вы могли бы использовать SED
, как это:
sed 'h;s/,[^|]*//g;x
/,/{s/|[^,|]*,*/|-/g;H;}
x;s/-\([^|]\)/\1/g;P;D'
Это ранило относительно проще в конце концов. Применяя этот маленький скрипт к вашим данным:
key1|0|11881|0|0|0|0|11769|0|0|0
key2|2027|345|0|1|0|2040|364|0|1|0
key2|-|712|-|-|-|-|729|-|-|-
key3|0|670944|0|0|0|0|495554|0|0|0
key4|1847|1|0|0|0|1814|1|0|0|0
key4|-|21|-|-|-|-|22|-|-|-
key5|1880|11|0|154|0|1886|11|0|151|0
key5|-|402|-|-|-|-|397|-|-|-
key6|1|65|0|8|0|16684|51|0|8|0
key6|1|4570|-|-|-|0|4176|-|-|-
key6|19137|-|-|-|-|-|-|-|-|-
key7|1851|11|0|202|0|1856|13|0|193|0
key7|-|757|-|-|-|-|751|-|-|-
в основном SED
просто решает каждое поле с обоих концов. Сначала он сохраняет копию своей текущей итерации в H
старого пространства. Затем SED
удаляет все, от каждого поля после первой запятой. После этого SED
выключается обратно к сохраненной копии, поэтому он может удалить поле, которое он просто сохранен в другом буфере.
Если запятыми остаются, добавляет вторую копию к первому следующему вставленным \ N
символ EWLINE, так что он может резать как минимум еще раз, когда P; D
P
Rint Затем D
D Elete только до первого происхождения \ N
символ EWLine в области шаблона, прежде чем начать с тем, что остается.
-121--105607-
ZSH - это гораздо более элегантное решение , но если это не ваша оболочка, вы можете использовать awk
:
printf "%s\n" "$path"
/home/user/working-root-directory/band-folder/album-name/music-file.mp3
band=$(awk -F/ '{print $(NF-2)}' <(printf "%s" "$path"))
printf "%s\n" "$band"
band-folder
album=$(awk -F/ '{print $(NF-1)}' <(printf "%s" "$path"))
printf "%s\n" "$album"
album-name
file=$(awk -F/ '{print $NF}' <(printf "%s" "$path"))
printf "%s\n" "$file"
music-file.mp3
Ты не хочешь делать это на вечеринке, но потому что ты спросил, вот как ты можешь разделить это.
#!/bin/bash
re='^[0-9]+$'
for x in `/usr/bin/ls -l --time-style=+'%s' /var/indexes | sort -k3,3 | awk '{print $3 $7}'`
do
read -A nm <<< "$x"
if [[ ${nm[0]} =~ $re ]] ; then
echo "found one " ${nm[1]}
fi
done
В awk проще так:
/usr/bin/ls -l --time-style=+'%s' /var/indexes | sort -k3,3 | awk '($3 ~ /^[0-9]+$/){print $7}'
На самом деле, правильным решением будет найти ж/ -ногруппу, как предложил Пол Х...
Не проще ли найти с флагом -nogroup? Например:
find /var/indexes -nogroup
Если вы хотите основывать скрипт вокруг ls, то awk - это инструмент, который я бы использовал для выбора столбцов.