Возьмите два столбца в файле с разделителями табуляции и объедините их в один

У меня была та же проблема, что я сделал (если я все помню):

Обновите ядро ​​до версии 4.9

apt-add-repository ppa:paulo-miguel-dias/mesa
apt update
apt install xserver-xorg-video-amdgpu mesa-utils
apt upgrade

, подробности см. Здесь

6
21.11.2018, 23:15
4 ответа

Используя только вырезать , если вы не против записи в файл (сначала скопируйте исходный файл, если он вам нужен), вы можете использовать:

$ cut -f 1,3 file >> file && cut -f 1,2 file
A   red
B   yellow
C   blue
A   green  
B   orange  
C   purple 

Explanation

  • 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
5
27.01.2020, 20:21

Подобно 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"}....`
9
27.01.2020, 20:21

Подобно решению Zanna, но без промежуточного файла / результата:

$ ( cut -f1,2 data && cut -f1,3 data ) >data.new

Вывод подоболочки - это pet в окончательный файл data.new . Подоболочка сначала извлекает первые два столбца, а затем первый и третий столбцы.

3
27.01.2020, 20:21
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 для стабильной сортировки по первому полю

(\ спасибо {Кусалананда})

3
27.01.2020, 20:21

Теги

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