как выбрать, скопируйте столбцы другого файла для формирования новых файлов

Я не думаю, что это возможно с ls, но Вы могли использовать, находят вместо этого:

find . -maxdepth 1 -iname '*abc*'
1
22.08.2013, 08:10
2 ответа

Я думаю, что Вы могли сделать это с paste, и возможно join.

paste file1 file2 > temp1
paste temp1 file3 > temp2
paste tmpe2 file4 > final

Это должно работать, если файлы содержат станцию 1 через n данные в порядке. В противном случае необходимо будет выровнять файлы так или иначе. Если "станция n" нотация является частью каждого файла, необходимо отсортировать их:

sort -o file1 file1
sort -o file2 file2
... and so forth

Затем Вы могли сделать join вместо paste как выше. join имеет некоторые хитрые опции о помещении строк в выводе, которые не имеют соответствия в другом файле, таким образом, Вам, вероятно, придется читать join страница справочника очень тщательно и эксперимент немного для получения то, что Вы хотите.

1
27.01.2020, 23:53

Из Вашего описания это кажется, что требуется выполнить итерации через эти 4 файла, Prec, Tmin, Tmax и ветер и взять данные столбца от каждого и объединить его в файл ожога на каждый столбец.

Подход

Один способ достигнуть этого при помощи Bash for цикл, paste и awk. Подход прошел бы примерно так:

for i in `seq 8`; do
    ... do stuff ...
done

Основная цель этого цикла состояла бы в том, чтобы ступить через столбцы, 1 - 8.

Вытаскивание столбцов

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

$ awk '{print $1}' Prec
1
0
0.254
0

Мы можем взять это шаг вперед и заставить его пропускать первую строку, которая является ссылочным номером столбца, как так:

$ awk 'NR>1{print $1}' Prec
0
0.254
0

Мы можем пойти еще больше путем параметризации столбца, который мы печатаем путем создания этого переменной, в которую мы передаем awk как так:

$ awk -v a=1 'NR>1{print $a}' wind
0
1.778
1.652
$ awk -v a=2 'NR>1{print $a}' wind
0
1.778
1.653

Хныканье столбцов из нескольких файлов

Этот бит является, вероятно, наименее изящным битом к этому решению, но я awk новичок, поэтому когда в сомнении, идет со взломом.

Здесь использовали вывод от нескольких awkкоторые вытягивают постолбцовые данные из каждого файла и вставку их вместе использование paste.

Вот 2 из файлов, именно так легче видеть.

столбец № 1

$ paste <(awk -v a=1 'NR>1 {print $a}' Prec) <(awk -v a=1 'NR>1 {print $a}' Tmin)
0   -23.349
0.254   -23.682
0   -24.302

столбец № 2

$ paste <(awk -v a=2 'NR>1 {print $a}' Prec) <(awk -v a=2 'NR>1 {print $a}' Tmin)
0   -23.339
0.254   -23.683
0   -24.301

Для получения столбцов из всех 4 файлов, мы просто подробно остановимся на этом подходе.

установите наш индекс ($i) к 1.

$ i=1
$ paste <(awk -v a=$i 'NR>1 {print $a}' Prec) <(awk -v a=$i 'NR>1 {print $a}' Tmin) <(awk -v a=$i 'NR>1{print $a}' Tmax) <(awk -v a=$i 'NR>1 {print $a}' wind)
0   -23.349 -17.087 0
0.254   -23.682 -20.082 1.778
0   -24.302 -20.48  1.652

установите наш индекс ($i) к 2.

$ i=2
$ paste <(awk -v a=$i 'NR>1 {print $a}' Prec) <(awk -v a=$i 'NR>1 {print $a}' Tmin) <(awk -v a=$i 'NR>1{print $a}' Tmax) <(awk -v a=$i 'NR>1 {print $a}' wind)
0   -23.339 -17.082 0
0.254   -23.683 -20.095 1.778
0   -24.301 -20.481 1.653

Соединение всего этого

Поэтому теперь давайте соединимся paste <(awk ..) <(awk ..) <(awk ..) <(awk ..) в for цикл.

$ for i in `seq 8`; do 
  echo "## $i ##"
  paste <(awk -v a=$i 'NR>1 {print $a}' Prec) <(awk -v a=$i 'NR>1 {print $a}' Tmin) <(awk -v a=$i 'NR>1{print $a}' Tmax) <(awk -v a=$i 'NR>1 {print $a}' wind)
done
## 1 ##
0   -23.349 -17.087 0
0.254   -23.682 -20.082 1.778
0   -24.302 -20.48  1.652
## 2 ##
0   -23.339 -17.082 0
0.254   -23.683 -20.095 1.778
0   -24.301 -20.481 1.653
## 3 ##
0   -23.327 -17.077 0
0.254   -23.685 -20.109 1.778
0   -24.3   -20.483 1.654
...

Я добавил дополнительное echo выше того так, чтобы в выводе легче видеть, какой столбец печатается.

Запись всего в файлы

Путем добавления этого бита после paste ... команда, мы можем выписать результаты в отдельные файлы, когда Вы указали.

paste ... | tee out$i.txt

Все это как один лайнер:

$ for i in `seq 8`;do echo "## $i ##"; paste <(awk -v a=$i 'NR>1 {print $a}' Prec) <(awk -v a=$i 'NR>1 {print $a}' Tmin) <(awk -v a=$i 'NR>1{print $a}' Tmax) <(awk -v a=$i 'NR>1 {print $a}' wind) | tee out$i.txt;done

Который приводит к этим записанным файлам:

$ ll
total 48
-rw-rw-r-- 1 saml saml  71 Aug 21 23:17 out1.txt
-rw-rw-r-- 1 saml saml  72 Aug 21 23:17 out2.txt
-rw-rw-r-- 1 saml saml  70 Aug 21 23:17 out3.txt
-rw-rw-r-- 1 saml saml  72 Aug 21 23:17 out4.txt
-rw-rw-r-- 1 saml saml  71 Aug 21 23:17 out5.txt
-rw-rw-r-- 1 saml saml  71 Aug 21 23:17 out6.txt
-rw-rw-r-- 1 saml saml  70 Aug 21 23:17 out7.txt
-rw-rw-r-- 1 saml saml  71 Aug 21 23:17 out8.txt
0
27.01.2020, 23:53
  • 1
    за помощь мне. Проблема решена успешно. –  AiB 22.08.2013, 08:04
  • 2
    @user45611 - замечательный. Если Вы думаете, что этот ответ был полезен и/или решил Вашу проблему непосредственно, рассмотрите голосование его и принятие его. –  slm♦ 22.08.2013, 08:08

Теги

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