В этом ответе:
bash + xargs однострочный python однострочный Ruby однострочный$> cat input_file.txt | xargs -L 1 bash -c 'for i; do : ; done ; echo $1;echo $i' bash
Это по существу дает каждой строке bash как аргументы командной строки, цикл, пока мы не получим последний, и выведем их.
] Демонстрация:
$> cat input_file.txt
UniRef90_Q8YC41 Putative binding protein BMEII0691 MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41 Putative binding protein BMEII0691 MNRFIAFFRSVFLIGLVATAFGRACA
$> cat input_file.txt | xargs -L 1 bash -c 'for i; do : ; done ; echo $1;echo $i' bash
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
Еще более короткая версия:
$> cat input_file.txt | xargs -L 1 bash -c 'echo $1;echo ${@: -1}' bash
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
Этот one-liner собирает список строк, которые в основном являются первым словом + новой строкой + последним словом. Наконец, он печатает все элементы списка, как одну строку, соединенную с новой строкой.
python -c 'import sys ; print "\n".join([ l.split()[0] + "\n" + l.split()[-1] for l in sys.stdin ])' < input_file.txt
Демонстрация использования:
$ python -c 'import sys ; print "\n".join([ l.split()[0] + "\n" + l.split()[-1] for l in sys.stdin ])' < input_file.txt
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
В этом одном лайнере флаг -n работает как цикл while gets . . . end. $_ содержит значение каждой прочитанной строки, поэтому для каждой строки мы разбиваем ее на массив слов, а затем печатаем первый и последний.
$ ruby -ne 'words=$_.split(); puts words[0],words[-1]' < input_file.txt
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA
UniRef90_Q8YC41
MNRFIAFFRSVFLIGLVATAFGRACA