2015-08-19 2 views
1

Я хочу переупорядочить столбцы файла txt, но есть пустые значения, которые вызывают проблему. Например:Переупорядочить столбец с пустыми значениями с помощью awk или sed

TestFile:

Name ID  Count Date Other 
A  1  10  513  x 
     6  15  312  x 
     3  18  314  x 
B  19  31  942  x 
     8  29  722  x 

, когда я попытался $ more testfile |awk '{print $2"\t"$1"\t"$3"\t"$4"\t"$5}' становится:

ID  Name Count Date Other 
1  A  10  513  x 
15  6  312  x 
18  3  314  x 
19  B  31  942  x 
29  8  722  x 

, который я не хочу, пожалуйста, помогите, я хочу, чтобы это было

ID  Name Count Date Other 
1  A  10  513  x 
15    6  312  x 
18    3  314  x 
19  B  31  942  x 
29    8  722  x 

Кроме того, я не уверен, какие столбцы могут содержать пустые значения, а colum n длина не исправлена, спасибо

+1

Является ли входной файл случайным образом уже разделенным табуляцией? Попробуйте 'awk -F '\ t' ...' и посмотрим, что он делает. Также опубликуйте вывод, который вы хотите, а не только тот результат, который вы не хотите. Если входной файл не разделен на вкладку, лучшим решением будет GNU awk с 'FIELDWIDTHS' - у вас есть GNU awk (' awk -version' скажет вам)? –

+0

@EdMorton, да, мой файл разделен табуляцией – once

ответ

2

Предположим, что ваш входной файл не разделенная табуляции и у вас есть (или можете получить) GNU AWK, то я рекомендую:

$ awk -v FIELDWIDTHS="8 8 8 8 8" -v OFS='\t' '{ 
    for (i=1;i<=NF;i++) { 
     gsub(/^\s+|\s+$/,"",$i) 
    } 
    t=$1; $1=$2; $2=t' 
}1' file 
ID  Name Count Date Other 
1  A  10  513  x 
6    15  312  x 
3    18  314  x 
19  B  31  942  x 
8    29  722  x 

Если файл разделенной табуляции, то все, что вам нужно:

awk 'BEGIN{FS=OFS="\t"} {t=$1; $1=$2; $2=t}1' file 
+0

мой файл разделен на вкладку, и ваш комментарий выше - ответ! Спасибо! Следующая команда работает '$ еще файл | awk -F '\ t' '{print $ 2" \ t "$ 1" \ t "$ 3" \ t "$ 4" \ t "$ 5}'> newfile' – once

+0

Может быть, вы можете отредактировать этот ответ, и я могу проверить его как правильный ответ, спасибо! – once

+0

ОК, я добавил правильное решение для входного файла, разделенного табуляцией. –

1

Наиболее естественной моделью для awk для использования являются столбцы, определяемые переходами от белого до небелого и обратно. Поскольку у вас есть столбцы, которые могут быть белыми, естественная модель не будет работать.

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

Name ID  Count Date Other 
A  1  10  513  x 
     6  15  312  x 
     3  18  314  x 
B  19  31  942  x 
     8  29  722  x 

все еще может быть перегруппированы, хотя и не так лаконично, как столбцы на основе перехода.

Следующая awk скрипт будет делать трюк, поменяв name и id:

{ 
    name = substr($0, 1,7); 
    id = substr($0, 9,7); 
    count = substr($0,17,7); 
    date = substr($0,25,7); 
    other = substr($0,33 ); 
    print id" "name" "count" "date" "other; 
} 

Если исходный файл называется pax.in и awk скрипт хранится в pax.awk, команда awk -f pax.awk pax.in даст вам, как хотелось бы :

ID  Name Count Date Other 
1  A  10  513  x 
6    15  312  x 
3    18  314  x 
19  B  31  942  x 
8    29  722  x 

Имейте в виду, что я написал этот сценарий относительно гибким, позволяя вам c очень легко упорядочить порядок столбцов. Если все, что вы хотите, чтобы поменять местами первые два столбца, вы можете использовать:

awk '{print substr($0,9,8)substr($0,1,8)substr($0,17)}' qq.in 

или чуть короче (если вы разрешили использовать другие инструменты):

sed -E 's/^(.{8})(.{8})/\2\1/' qq.in 
+0

«' '' '' между 'substr() s' в вашей последней команде awk ничего полезного не делает. –

1

Другая альтернатива awk использует количество полей. Если вы знаете свои данные, и это только дефицит в первом столбце, вы можете попробовать это.

awk -v OFS="\t" 'NF==4{$5=$4;$4=$3;$3=$2;$2=$1;$1=""} {print $2,$1,$3,$4,$5}' 

Однако выход будет разделен на вкладку вместо формата фиксированной длины.Вы можете добиться того же, используя printf и сменив OFS, но, возможно, вкладка разделена на то, что вам действительно нужно для табличного представления.

+0

это работает для небольшого тестового файла, но не работает хорошо для моих данных, не знаю, почему – once

+1

проверяет ваши данные с помощью 'awk '{print NF}'', чтобы проверить, сколько полей awk видит. На основе ваших данных выборки должно быть 4 или 5. – karakfa

Смежные вопросы