Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unix 在不工作的文件中填充包含俄语西里尔字符的文件-一个俄语字符计为2字节_Unix_Cyrillic - Fatal编程技术网

Unix 在不工作的文件中填充包含俄语西里尔字符的文件-一个俄语字符计为2字节

Unix 在不工作的文件中填充包含俄语西里尔字符的文件-一个俄语字符计为2字节,unix,cyrillic,Unix,Cyrillic,我正在尝试在Unix中创建具有固定列长度的文件。该文件包含俄文西里尔文字符,这些字符的解释与正常的1字节字符不同 我正在使用下面的脚本修改文件(列的分隔符为@-,行分隔符为\r\n): 对于具有普通字符的列,输出文件正确地包含200个字符的列,但对于具有30个西里尔字母的列,输出列仅包含170个字符。这样,文件中的行就不会有相同的长度,因为西里尔字母字符占用2个字节,代码将解释字节而不是字符 示例:ББКСЛАБА有10个字符,但脚本将其计算为有20个字符,因为它占用20个字节 一个输入文件示例

我正在尝试在Unix中创建具有固定列长度的文件。该文件包含俄文西里尔文字符,这些字符的解释与正常的1字节字符不同

我正在使用下面的脚本修改文件(列的分隔符为@-,行分隔符为\r\n):

对于具有普通字符的列,输出文件正确地包含200个字符的列,但对于具有30个西里尔字母的列,输出列仅包含170个字符。这样,文件中的行就不会有相同的长度,因为西里尔字母字符占用2个字节,代码将解释字节而不是字符

示例:ББКСЛАБА有10个字符,但脚本将其计算为有20个字符,因为它占用20个字节

一个输入文件示例:

НИКОЛАЕВНА@-@russ@-@12345@-@asklle@-@НИКОЛАЕВНА@-@454@-@111@-@asdfg
您能建议一种创建填充的方法,使所有行具有相同的字符数吗


谢谢大家!

我建议您使用
gawk
基于字符的字符串函数
substr
,来修剪字符串。 标准的
gawk
printf
宽度格式化功能是基于字符的。检查您是否正在使用最新的
gawk

要将所有字段修剪为200个字符,请执行以下操作:

for (i = 1; i <= NF; i++) $i = substr($i,1,200);
用于(i=1;i$output\u文件
或者更简洁地说:

script.awk
{

对于(i=1;i我不相信awk可以做到这一点,但是默认情况下,只要您的区域设置没有设置为“C”,gawk就应该处理这个问题。例如,
LC\u ALL=en\u US.UTF-8
应该使用gawk提供预期的行为。

尝试以下
awk
脚本:

script.awk
BEGIN{FS=“@-@”#字段分隔符为“@-@”
h=”“#长度(h)=10
h=h;#长度(h)=100
h=h;#长度(h)=200
}
{

for(i=1;感谢您的回复!但是,问题不在于宽度超过200个字符,而在于列没有达到最大宽度(本例中为200个)因为俄语字符被解释为2个字节,所以具有这类字符的行将保持较短的长度。因此,在这种情况下,我认为没有必要对它们进行修剪,因为这不会产生任何效果,我需要完全相反的结果-使一个俄语字符计为1字节,而不是2字节。
for (i = 1; i <= NF; i++) $i = substr($i,1,200);
awk -F '@-@' '{for(i=1;i<=NF;i++)$i=substr($i,1,200);printf("%-200s%-200s%-200s%-200s%-200s%-200s%-200s%-200s\r\n", $1, $2, $3, $4, $5, $6, $7, $8)}' $input_file > $output_file
{
    for (i = 1; i <= 8; i++) {
        $i = substr($i,1,200);
        printf("%-200s", $i);
    }
    print;
}
BEGIN {FS="@-@"; # field separator is '@-@'
    h="          "; # length(h) = 10
    h=h h h h h h h h h h; # length(h) = 100
    h=h h; # length(h) = 200
}
{
    for (i = 1; i <= 8; i++) {
        #length is character based function
        head = substr(h,1,(length(h)-length($i))); # cut alignment head to the correct length
        printf("%s%s", head, $i); # output the current aligned field
    }
    print;
}