У меня была та же проблема, что я сделал (если я все помню):
Обновите ядро до версии 4.9
apt-add-repository ppa:paulo-miguel-dias/mesa
apt update
apt install xserver-xorg-video-amdgpu mesa-utils
apt upgrade
Используя только вырезать
, если вы не против записи в файл (сначала скопируйте исходный файл, если он вам нужен), вы можете использовать:
$ cut -f 1,3 file >> file && cut -f 1,2 file
A red
B yellow
C blue
A green
B orange
C purple
cut -f 1,3 file
напечатать первый и третий столбцы файла
(которые должны быть разделены табуляцией) >> file
добавить вывод в файл
вместо отображения в терминале &&
, если это сработало, выполните следующую команду cut -f 1,2 file
распечатайте только первый и вторые столбцы файла
в терминале. Обратите внимание, что сам файл
в конечном итоге выглядит следующим образом:
A red green
B yellow orange
C blue purple
A green
B orange
C purple
поэтому, чтобы получить окончательный результат, который вы хотите в файле, вам нужно перенаправить в новый файл.
cut -f 1,3 file >> file && cut -f 1,2 file > file2
Подобно cut, вы также можете сделать это с помощью awk:
$ awk '{print $1,$2}' aa.txt && awk '{print $1,$3}' aa.txt
A red
B yellow
C blue
A green
B orange
C purple
# OR to send the output in a new file:
$ (awk '{print $1,$2}' aa.txt && awk '{print $1,$3}' aa.txt) >aaa.txt
Разница в том, что awk лучше обрабатывает пробелы, чем cut. Это полезно, если поля в каждой строке разделены более чем одним пробелом.
Например, если строка файла Красный
= один пробел, то вырезанное решение, как рекомендовано, может сделать это также успешно, но если строка Красный
= 3 пробела , то cut завершится неудачно, в то время как awk сможет получить поля 1 и 2 или поля 1 и 3.
Обновление:
Как указано в комментариях (спасибо don_crissti), это также можно сделать в чистом виде. awk:
awk 'BEGIN{FS=OFS=" "}{z[NR]=$1FS$3; print $1,$2}END{for (i=1; i<=NR; i++){print z[i]}}' a.txt
Пояснение:
FS : Input Field Separator
OFS : Output Field Separator
FS=OFS=" " : input & output field separator is set to "space"
z[NR] : Creating an array with name 'z' and index the record number:
z[1] for first line, z[2] for second line , z[3] for third line
z[NR]=$1FS$3 : to each array element assign field1-FieldSeparator FS=space)-field2
So for first line the fields1=A and Fields 3=green will be stored in z[1] => equals to z[1]="A green"
print $1,$2 : Justs prints on screen 1stfield (A) and 2ndfield (red) of the current line, printed separated by OFS
When the file is finished (END) then with a for loop we print out the whole z array entries => print z[i]
For i=1 => print z[1] => prints "A green"
For i=2 => print z[2] => prints "B orange"
For i=3 => print z[3] => prints "C purple"
PS: If fields are not separated by space but by tab , then Begin section of this awk one-liner must be changed to `awk 'BEGIN {FS=OFS="\t"}....`
Подобно решению Zanna, но без промежуточного файла / результата:
$ ( cut -f1,2 data && cut -f1,3 data ) >data.new
Вывод подоболочки - это pet в окончательный файл data.new
. Подоболочка сначала извлекает первые два столбца, а затем первый и третий столбцы.
awk '{print 1 $1,$2; print 2 $1,$3}' ex |sort |cut -c 2-
Обновление: чтобы гарантировать соблюдение порядка:
awk '{print 1,$1,$2; print 2,$1,$3}' ex |sort -sk1,1 |cut -c 3-
sort -sk1,1
для стабильной сортировки по первому полю (\ спасибо {Кусалананда})