GNU Linux/Bash: A function that splits a word in half
The following function takes one argument – a text file.
The text file should contain one word on each line.
The function reads the text file (argument) line by line.
Then it checks if the line has one word; if this is true, it splits the word in half.
Finally, it prints the two new words with a space between them.
#!/bin/bash
splitWordsInHalf () {
# This function takes one argument - a text file.
# The text file contains one word on each line.
# It reads the text file (argument) line by line.
# Then it checks if the line contains one word, if this is true, it splits the word in half.
# Finally, it prints the two new words with a space between them
while read line
do
words=( $line )
if [ ${#words[@]} == 1 ]
then
echo ${line:0:${#line}/2} ${line:${#line}/2}
fi
done < $1
}
splitWordsInHalf input.txt
Example
Using the following input file:
banana apple ball car door
We will get the following output when we execute splitWordsInHalf input.txt
:
ban ana ap ple ba ll c ar do or
Notes
The following parts of the code are in charge of looping on the data of the incoming file. The parameter (the input file) given to the function is translated into the variable $1
. The while loop gets one line of text on each iteration and assigns the text to the variable that is named line
. You could have chosen any other name that suits you instead of the word line
.
splitWordsInHalf () {
while read line
do
...
done < $1
}
The next part of the code (words=( $line )
) converts the string value that is contained in the line
variable into an array of words, and it assigns that array to the variable named words
. Then, it counts the number of elements in the array (the number of words in the line) using the following ${#words[@]}
and it checks that there is only one item.
words=( $line )
if [ ${#words[@]} == 1 ]
then
...
fi
The following line will print two strings. The first string is a sub-string of variable line
that is composed by the first half of the value. The second sub-string is the second half of the value contained in the variable named line
.
echo ${line:0:${#line}/2} ${line:${#line}/2}
The ${#line}
will return the length of the string contained in the variable.
The structure ${VARIABLE:START:END}
defines the slice of the string that we want returned.