Як можна розділити текстовий файл на 70% та 30% за допомогою команди split?
Як можна розділити текстовий файл на 70% та 30% за допомогою команди split?
Відповіді:
Команди нижче працюватимуть для відсотків понад 50% (якщо ви хочете розділити лише на два файли), швидкий та брудний підхід.
1) розділити 70% на основі ліній
split -l $[ $(wc -l filename|cut -d" " -f1) * 70 / 100 ] filename
2) розділити 70% на байтах
split -b $[ $(wc -c filename|cut -d" " -f1) * 70 / 100 ] filename
split -l $[ $(wc -l filename | xargs | cut -d" " -f1) * 70 / 100 ] filename
Ви можете csplit
розділити їх на дві частини (використовуючи будь-який відсоток), наприклад, перший фрагмент - перший 20% рядків, другий фрагмент - решта 80% рядків:
csplit infile $(( $(wc -l < infile) * 2 / 10 + 1))
$(wc -l < infile)
: загальна кількість рядків
2 / 10
: відсоток
+1
: додайте один рядок, оскільки csplit
розбиваєтьсяup to but not including line N
Однак ви можете розділити лише на основі рядків.
В основному, якщо у вас є номер рядка, $(( $(wc -l < file) * 2 / 10))
ви можете використовувати будь-який інструмент, орієнтований на лінію:
sed 1,$(( $(wc -l < infile) * 2 / 10))'{
w 20-infile
d
}' infile > 80-infile
або, навіть крутіше:
{ head -n$(( $(wc -l < infile) * 2 / 10)) > 20-infile; cat > 80-infile; } <infile
хоча деякі head
з них німі і не відповідають стандартам, тому це не працюватиме у всіх налаштуваннях ...
{ BS=$(($(wc -c <file) * $P / 100))
dd count=1 bs="$BS" >file1; cat
} <file >file2 2>/dev/null
... слід працювати в цьому простому випадку, тому що ви розщеплюєтеся лише один раз - і так, мабуть split
, це трохи зайве. До тих пір , поки файл є доступним для пошуку, dd
буде робити тільки один read()
ON <stdin
, і тому cat
залишилися почати його read()
в будь-якому пункті dd
залишає.
Якщо файл великий, то a count=1 bs=$big_ol_num
може отримати трохи громіздкого, і його можна заблокувати за допомогою додаткової - але простий математики оболонки.
Ні-вхід доступного для пошуку - як з труби - може привести до перекосу dd
«результати с, хоча це може бути оброблено , а також з / ГНУ dd
» и iflag=fullblock
.
Наступний код використовує head
та tail
працює з будь-яким співвідношенням (40 у цьому випадку 40):
export FILE_NAME=train.vw
head -n $[ $(wc -l ${FILE_NAME}|cut -d" " -f1) * 40 / 100 ] ${FILE_NAME} > train_40.vw
tail -n +$[ ($(wc -l ${FILE_NAME}|cut -d" " -f1) * 40 / 100) + 1 ] ${FILE_NAME} > train_60.vw