Jak mogę dodać kolumnę wartości w pliku, który ma określoną liczbę wierszy. Mam plik wejściowy taki jak ten:
Plik wejściowy:
SPATA17 1 217947738
LYPLAL1 1 219383905
FAM47E 4 77192838
SHROOM3 4 77660162
SHROOM3 4 77660731
SHROOM3 4 77662248
Plik wyjściowy:
SPATA17 1 217947738 file1
LYPLAL1 1 219383905 file1
FAM47E 4 77192838 file1
SHROOM3 4 77660162 file1
SHROOM3 4 77660731 file1
SHROOM3 4 77662248 file1
W tym przypadku chcę dodać kolumnę wartości, aż do liczby wierszy w pliku. Wartość pozostaje spójna, na przykład „plik1”.
Powodem jest to, że mam 100 takich plików. Nie chcę otwierać każdego pliku i wklejać kolumny. Istnieje również sposób na zautomatyzowanie tego, przechodząc do katalogu i dodając kolumnę wartości. Wartość pochodzi z nazwy pliku, którą należy dodać w każdym wierszu pliku w ostatniej / pierwszej kolumnie.
linux
shell-script
awk
Ron
źródło
źródło
sed
jest najbardziej praktyczny w przypadku zastępowania wzorów i zapisywania w miejscu. Dla twojego wymogu zapisania pliku była to stosunkowo wygodna opcja. Jeśli nie musisz zapisywać tego samego pliku, który przetwarzasz,awk
zazwyczaj łatwiej jest pracować.awk
zbyt często mnie denerwują separatory pól wejściowych / wyjściowych, dlatego staram się unikać używania go, gdy tylko jest to możliwe, czyniąc jesed
bardziej atrakcyjnym.Chodźcie, dlaczego polecacie te potężne narzędzia, kiedy istnieje
paste
rozkaz!Przy odrobinie podstępu możesz użyć
paste
do celu PO. Jednak nie zastąpi plików w miejscu:Spowoduje to wklejenie odpowiedniej nazwy pliku jako ostatniej kolumny każdego pliku do nowego pliku
filename.new
źródło
paste
jest z pewnością ukrytym klejnotem.Możesz użyć
awk
:źródło
FILENAME
jest zmienną wawk
, rozwija się do bieżącejawk
przetwarzanej nazwy pliku . Po prostu zrób to jeden, podaj wszystkie pliki doawk
.GNU awk 4.1.0
lub później, możesz użyć-i
do edycji w miejscu. W przeciwnym razie powinieneś przekierowaćawk
wyjście do pliku tymczasowego, a następnie użyćgrep
do wyodrębnienia wiersza z każdego pliku.for file in *; do awk 'BEGIN{OFS="\t"}{print $0, FILENAME}' $file; done