Вы можете использовать этот скрипт из оболочки следующим образом:
$ ./transpose_csv < theinfilename > theoutfilename
И вот сценарий:
#!/usr/bin/env python
import sys, csv, itertools
rows = itertools.izip(*csv.reader(sys.stdin, delimiter=','))
sys.stdout.writelines(','.join(row) + '\n' for row in rows)
#!/bin/bash
# If $1 is not given, find will assume cwd
print_file(){
local inputfile="$1"
while IFS= read -r line || [ -n "$line" ];do
printf "%s\\" "$line"
done < "$inputfile"
}
get_file_info(){
local filepath="$1"
counter=$((counter+1))
parent=${filepath%/*}
if [ "$parent" = "$filepath" ]; then
parent="."
fi
printf "%d,%s," "$counter" "$parent"
}
main(){
if [ -z "$1" ];then
set "."
fi
find "$1" -type f -name "result.txt" -print0 |
while IFS= read -r -d '' path
do
get_file_info "$path"
print_file "$path"
printf "\n"
done
}
main "$@"
Как это работает, вы должны сохранить это как файл, например results2csv.sh, сделать исполняемый файл с chmod +x и запустить либо путем полного пути к сценарий или поместить его в папку ~/bin, запустите source ~/.bashrc и вызовите скрипт по имени.
Вот как работает этот скрипт:
$ ./result2csv.sh things
1,things/thing2,to be or not to be\that's Boolean logic\
2,things/thing1,one potato\two potato\
Дайте сценарию топ- в большинстве каталогов, и он будет проходить через подкаталоги, находящие файлы, и выводит путь к файлу в соответствии с тем, как вы указали самый верхний каталог. Так, например, если вы указали ./things как наибольший, это приведет к тому, что первая строка будет иметь ./thing/things2 как путь к файлу. Новые строки заменяются обратными косыми чертами для отображения содержимого файла. Обратите внимание, что он также будет считать текущий рабочий каталог "." если каталог не указан.
$ cd things
$ ../result2csv.sh
1,./thing2,to be or not to be\that's Boolean logic\
2,./thing1,one potato\two potato\
Все, что вам нужно сделать сейчас, это вызов results2csv.sh directory > output.csv для вывода данных в файл, и вы закончили
Я не знаю точно, как это сделать с помощью только команд терминала, но я сделал аналогичную вещь, используя скрипт python из этого потока:
https://stackoverflow.com/questions/37644441/ python-run-script-in-all-subdirectories
С этим вы можете легко добавить funcionality для записи строк в CSV-файл:
https://stackoverflow.com/ Вопросы / 37644441 / python-run-script-in-all-subdirectories для Python 2
https://docs.python.org/3/library/csv.html для Python 3 [ ! d6]
Ну, вот какой способ (теперь отредактированный, чтобы превратить разрывы строк в пробелы, благодаря этому ответу на Stack Overflow):
shopt -s globstar
n=0; for i in **/result.txt; do sed -e ":l;N;\$!bl;s/\n/ /g; s/.*/$((++n))\. "${i%%/*}"\t&/" "$i"; done
Вы можете добавить перенаправление для записи в файл
n=0; for i in **/result.txt; do sed ":l;N;\$!bl;s/\n/ /g; s/.*/$((++n))\. "${i%%/*}"\t&/" "$i"; done > outfile
Вот более читаемая версия, которая также более переносима (должна работать во всех версиях sed), поскольку для разделения команд используются новые строки вместо ;:
#!/bin/bash
shopt -s globstar
n=0
for i in **/result.txt; do
sed ":l
N
\$!bl
s/\n/ /g
s/.*/$((++n))\.,"${i%%/*}",&/" -- "$i"
done > outfile
#!/bin/bash
# If $1 is not given, find will assume cwd
print_file(){
local inputfile="$1"
while IFS= read -r line || [ -n "$line" ];do
printf "%s\\" "$line"
done < "$inputfile"
}
get_file_info(){
local filepath="$1"
counter=$((counter+1))
parent=${filepath%/*}
if [ "$parent" = "$filepath" ]; then
parent="."
fi
printf "%d,%s," "$counter" "$parent"
}
main(){
if [ -z "$1" ];then
set "."
fi
find "$1" -type f -name "result.txt" -print0 |
while IFS= read -r -d '' path
do
get_file_info "$path"
print_file "$path"
printf "\n"
done
}
main "$@"
Как это работает, вы должны сохранить это как файл, например results2csv.sh, сделать исполняемый файл с chmod +x и запустить либо путем полного пути к сценарий или поместить его в папку ~/bin, запустите source ~/.bashrc и вызовите скрипт по имени.
Вот как работает этот скрипт:
$ ./result2csv.sh things
1,things/thing2,to be or not to be\that's Boolean logic\
2,things/thing1,one potato\two potato\
Дайте сценарию топ- в большинстве каталогов, и он будет проходить через подкаталоги, находящие файлы, и выводит путь к файлу в соответствии с тем, как вы указали самый верхний каталог. Так, например, если вы указали ./things как наибольший, это приведет к тому, что первая строка будет иметь ./thing/things2 как путь к файлу. Новые строки заменяются обратными косыми чертами для отображения содержимого файла. Обратите внимание, что он также будет считать текущий рабочий каталог "." если каталог не указан.
$ cd things
$ ../result2csv.sh
1,./thing2,to be or not to be\that's Boolean logic\
2,./thing1,one potato\two potato\
Все, что вам нужно сделать сейчас, это вызов results2csv.sh directory > output.csv для вывода данных в файл, и вы закончили
Я не знаю точно, как это сделать с помощью только команд терминала, но я сделал аналогичную вещь, используя скрипт python из этого потока:
https://stackoverflow.com/questions/37644441/ python-run-script-in-all-subdirectories
С этим вы можете легко добавить funcionality для записи строк в CSV-файл:
https://stackoverflow.com/ Вопросы / 37644441 / python-run-script-in-all-subdirectories для Python 2
https://docs.python.org/3/library/csv.html для Python 3 [ ! d6]
Ну, вот какой способ (теперь отредактированный, чтобы превратить разрывы строк в пробелы, благодаря этому ответу на Stack Overflow):
shopt -s globstar
n=0; for i in **/result.txt; do sed -e ":l;N;\$!bl;s/\n/ /g; s/.*/$((++n))\. "${i%%/*}"\t&/" "$i"; done
Вы можете добавить перенаправление для записи в файл
n=0; for i in **/result.txt; do sed ":l;N;\$!bl;s/\n/ /g; s/.*/$((++n))\. "${i%%/*}"\t&/" "$i"; done > outfile
Вот более читаемая версия, которая также более переносима (должна работать во всех версиях sed), поскольку для разделения команд используются новые строки вместо ;:
#!/bin/bash
shopt -s globstar
n=0
for i in **/result.txt; do
sed ":l
N
\$!bl
s/\n/ /g
s/.*/$((++n))\.,"${i%%/*}",&/" -- "$i"
done > outfile