我有一个大文本文件,我只想在一个命令行中打印每行的前 4 个、前 5 个和前 8 个字符。
例如我有以下几行:
123456789ab
ABCdefgih55
所以输出必须是:
1234
ABCd
12345
ABCde
12345678
ABCdefgh
答案1
for len in 4 5 8; do
cut -c "1-$len" file
done
这会cut -c
重复使用来剪切名为 的文件的每一行的第一部分file
。剪切位的长度取决于循环变量len
。
如果您严格遵守“一行”标准:
for len in 4 5 8; do cut -c "1-$len" file; done
或者,作为一个易于使用的 shell 函数:
cut_to_lengths () {
file=$1; shift
for len do
cut -c "1-$len" "$file"
done
}
使用它:
$ cut_to_lengths file 4 5 8 1
1234
ABCd
12345
ABCde
12345678
ABCdefgi
1
A
在评论您指定您不想输出行,如果它们是更短切割长度。
为此,我们可以将cut
命令更改为awk
命令:
awk -v len="$len" 'length >= len { print substr($0, 1, len) }'
将上面代码中的替换cut -c "1-$len"
为上面的命令。awk
答案2
您的示例格式不正确。我想空白应该是一个新行?如果是这样,最简单的方法是使用cut
$ cut -c -4 input
将打印每行的前 4 个字符。使用您喜欢的任意数量的字符重复此操作。
答案3
尝试以下操作
for line in `cat input`; do echo ${line} | cut -c 1-4 && echo ${line} | cut -c 1-5 && echo ${line} | cut -c 1-8; done
这给出了
1234
12345
12345678
ABCd
ABCde
ABCdefgi