Заменить первый символ последней строки файла Unix на имя файла - PullRequest
0 голосов
/ 15 декабря 2011

Нам нужен сценарий оболочки, который извлекает все txt-файлы в текущем каталоге и для каждого файла проверяет, является ли он пустым файлом или содержит какие-либо данные в нем (что, я считаю, можно сделать с помощью команды wc).

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

Z|11|21||||||||||

То есть последняя строка имеет символ Z, затем |, затем an integer, затем |, затем an integer, затем определенное количество символов |.

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

Нам нужнокод, в котором, если файл не пустой, он берет файл, заменяет «Z» в последней строке на «filename.txt» и записывает новые данные в другой файл, например, tempfile.Таким образом, последняя строка будет иметь вид:

filename.txt|11|21|||||||

Оставшаяся часть строки остается неизменной.Из временного файла извлекается последняя строка, т.е. filename.txt|int|int|||||, и объединяется в окончательный файл.Содержимое tempfile очищается для получения данных из следующего filename.txt в том же каталоге.finalfile имеет отредактированную версию последних строк всех непустых текстовых файлов в этом каталоге.

Например: file1.txt имеет данные как

....
....
....
Z|1|1|||||

, а file2.txt имеет данные как

....
....
....
Z|2|34|||||

После запуска скрипта новые данные file1.txt становятся

.....
.....
.....
file1.txt|1|1||||||

. Они будут записаны в новый файл, скажем, temp.txt, который изначально пуст.Оттуда последняя строка объединяется в файл final.txt.Итак, данные в final.txt:

file1.txt|1|1||||||

После этого слияния данные в temp.txt очищаются
Новые данные file2.txt становятся

...
...
...
file2.txt|2|34||||||

Это будет записано в тот же файл temp.txt.Оттуда последняя строка объединяется в тот же файл final.txt.
Итак, данные в final.txt имеют значение

file1.txt|1|1||||||
file2.txt|2|34||||||

После рассмотрения N числа файлов, которые были возвращены, как имеющие типtxt и непустые, и в одном и том же каталоге данные в final.txt становятся

file1.txt|1|1||||||
file2.txt|2|34||||||
file3.txt|8|3||||||
.......
.......
.......
fileN.txt|22|3|||||

Для некоторых условий я уже знаю команду, например
Для поиска файлов в каталогевведите текст,

find <directory> -type f -name "*.txt"  

Для того, чтобы взять последнюю строку и объединить ее в другой файл

tail -1 file.txt>>destination.txt

1 Ответ

1 голос
/ 15 декабря 2011

Вы можете использовать «sed» для замены символа «z».Вы будете в цикле, поэтому вы можете использовать имя файла, которое у вас есть в этом.Это просто удаляет Z, а затем выводит строку и имя файла.

Удачи.

#!/bin/bash
filename=test.txt
line=`tail -1 $filename | sed "s/Z/$filename/"`
echo $line

Редактировать:

Вы сначала выполнили команду find и увидели вывод?Это, конечно, ./ в начале каждой строки.Это сломает sed, так как sed использует / в качестве разделителя.Он также не будет работать с вашей формулировкой проблемы, у которой нет лишнего "/" перед именем файла.Вы сказали текущий каталог, и команда, которую вы дадите, будет проходить по подкаталогам ALL .Попробуйте быть простым и использовать LS.

# `2>/dev/null` puts stderr to null, instead of writing to screen.  this stops
# us getting the "no files found" (error) and thinking it's a file!
for filename in `ls *.txt 2>/dev/null` ; do
    ... stuff ...
done 
...