GNU/Linux >> Znalost Linux >  >> Linux

Jak získat prvních n znaků každého řádku v unixovém datovém souboru

To lze ve skutečnosti provést v Bash bez použití jakýchkoli externích programů (skripty používající toto musí začínat #!/bin/bash místo #!/bin/sh a nebude kompatibilní s POSIX shell) pomocí výrazu ${VARIABLE:offset:length} (kde :length je volitelné):

#!/bin/bash

STR="123456789"

echo ${STR:0:1}
echo ${STR:0:5}
echo ${STR:0:10}
echo ${STR:5:10}
echo ${STR:8:10}

bude mít tento výstup:

1
12345
123456789
6789
9

Všimněte si, že počáteční offset začíná na nule a délka musí být alespoň jedna. Můžete také odsadit z pravé strany řetězce pomocí záporného odsazení v závorkách:

echo ${STR:(-5):4}

5678

Chcete-li číst soubor, opakovaně načtěte prvních 8 znaků pro každý řádek a vytiskněte je na terminál, použijte while smyčka takto:

while read LINE
    do echo "${STD:0:8}"
done < "/path/to/the/text_file"

Extrémně užitečný zdroj pro vše, co potřebujete vědět o manipulaci s řetězcem Bash, je zde:https://tldp.org/LDP/abs/html/string-manipulation.html


S cut :

$ cut -c-22 file
0000000000011999980001
0000000000021999980001
0000000000031999980001
0000000000041999980001
0000000000051999980001
0000000000061999980001

Pokud rozumím druhému požadavku, chcete rozdělit prvních 22 znaků do dvou sloupců o délce 10 a 12. sed je pro to nejlepší volbou:

$ sed -r 's/(.{10})(.{12}).*/\1 \2/' file
0000000000 011999980001
0000000000 021999980001
0000000000 031999980001
0000000000 041999980001
0000000000 051999980001
0000000000 061999980001

sudo_O poskytlo pěkné řešení střihu a sed, jen jsem přidal awk one-liner:

awk 'BEGIN{FIELDWIDTHS="22"} {print $1}' file

echo "000000000001199998000180000     DUMMY RAG"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'
0000000000011999980001

s prázdným znakem (záleží na vašem požadavku, chcete přeskočit mezery nebo je chcete zahrnout a započítat do výstupu)

pokud by se prázdná místa měla počítat a zobrazovat také ve výstupu:(nemusíte měnit cmd výše)

echo "0 0 0 0 00000001199998000180000"|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'                                                                         
0 0 0 0 00000001199998

pokud chcete tyto mezery přeskočit:(rychlé a špinavé)

echo "0 0 0 0 00000001199998000180000"|sed 's/ //g'|awk 'BEGIN{FIELDWIDTHS="22"} {print $1}'                                                            
0000000000011999980001

Linux
  1. Jak vložit text před první řádek souboru?

  2. Jak analyzovat každý řádek textového souboru jako argument příkazu?

  3. Jak počítat řádky v souboru v UNIX/Linux

  1. Jak vyčistit přípony souborů?

  2. Jak přidat řetězec data na každý řádek nepřetržitě zapisovaného souboru protokolu

  3. Jak připojím text k souboru?

  1. Jak vytvořit každý výběr nabídky v 1 řádku namísto více výběrů v 1 řádku?

  2. Jak vložit mezeru každé čtyři znaky do dlouhého řádku?

  3. Jak rozdělit soubor a zachovat první řádek v každém z kusů?