다음과 같이 파일에서 첫 번째 열을 제거해야 합니다.
165 1 chr22 42090593 0 1 chr22 42090609 1 42 42
166 1 chr22 42090593 0 1 chr22 42090654 1 42 42
167 1 chr22 42090595 0 1 chr22 42090633 1 42 42
168 0 chr22 42090612 0 1 chr22 42090656 1 42 42
169 0 chr22 42090614 0 0 chr22 42090617 1 40 42
170 0 chr22 42090647 0 1 chr22 42090749 1 42 42
171 1 chr22 42090684 0 1 chr22 42090692 1 42 42
172 1 chr22 42090733 0 1 chr22 42090743 1 42 42
173 1 chr22 42090733 0 1 chr22 42090775 1 42 42
174 1 chr22 42090733 0 1 chr22 42090789 1 42 42
175 1 chr22 42090757 0 1 chr22 42090787 1 42 24
176 0 chr22 42090778 0 0 chr22 42090790 1 42 42
177 0 chr22 42090800 0 0 chr22 42090802 1 42 42
178 0 chr22 42090803 0 0 chr22 42090806 1 42 42
주문하다
awk '{$1=""; print $0}'
첫 번째 열을 올바르게 제거하지만 이런 방식으로 형식을 변경합니다.
1 chr22 51178322 0 0 chr22 51178659 1 42 42
0 chr22 51178661 0 0 chr22 51178663 1 42 42
0 chr22 51178667 0 1 chr22 51178790 1 42 23
1 chr22 51178755 0 0 chr22 51178764 1 42 42
0 chr22 51178808 0 1 chr22 51178871 1 42 42
1 chr22 51178869 0 1 chr22 51178895 1 42 42
1 chr22 51178881 0 1 chr22 51178893 1 42 42
1 chr22 51178881 0 1 chr22 51178895 1 42 42
1 chr22 51179213 0 1 chr22 51179213 1 42 42
1 chr22 51180087 0 1 chr22 51180093 1 42 42
1 chr22 51180134 0 0 chr22 51181889 1 42 42
0 chr22 51186192 0 0 chr22 51186192 1 42 42
0 chr22 51186192 0 0 chr22 51186192 1 42 42
어떤 아이디어가 있나요?
답변1
귀하의 접근 방식에는 두 가지 문제가 있습니다. 첫째, 이것은 탭으로 구분된 파일처럼 보이며 awk에게 탭을 사용하도록 지시하지 않았습니다. 둘째, awk에서 필드를 설정할 때 ""
필드를 삭제하는 것이 아니라 지우기만 하면 됩니다. 따라서 여전히 인쇄되므로 출력의 각 줄 시작 부분에 추가 공간이 있는 것입니다.
따라서 awk에서 이 작업을 수행하려면 다음과 같은 것이 필요합니다(예제의 선행 공백이 실제로 파일의 일부가 아니라고 가정).
$ awk -F"\t" 'BEGIN{OFS="\t"}{for(i=2;i<NF;i++){printf "%s%s",$i,OFS} print $NF}' file
1 chr22 42090593 0 1 chr22 42090609 1 42 42
1 chr22 42090593 0 1 chr22 42090654 1 42 42
1 chr22 42090595 0 1 chr22 42090633 1 42 42
0 chr22 42090612 0 1 chr22 42090656 1 42 42
0 chr22 42090614 0 0 chr22 42090617 1 40 42
0 chr22 42090647 0 1 chr22 42090749 1 42 42
1 chr22 42090684 0 1 chr22 42090692 1 42 42
1 chr22 42090733 0 1 chr22 42090743 1 42 42
1 chr22 42090733 0 1 chr22 42090775 1 42 42
1 chr22 42090733 0 1 chr22 42090789 1 42 42
1 chr22 42090757 0 1 chr22 42090787 1 42 24
0 chr22 42090778 0 0 chr22 42090790 1 42 42
0 chr22 42090800 0 0 chr22 42090802 1 42 42
0 chr22 42090803 0 0 chr22 42090806 1 42 42
그러나 다음과 같은 다른 도구는cut
이미 언급됨여기는 더 간단합니다. 파일이 탭으로 구분된 경우 다음을 수행할 수 있습니다.
$ cut -f2- file
1 chr22 42090593 0 1 chr22 42090609 1 42 42
1 chr22 42090593 0 1 chr22 42090654 1 42 42
1 chr22 42090595 0 1 chr22 42090633 1 42 42
0 chr22 42090612 0 1 chr22 42090656 1 42 42
0 chr22 42090614 0 0 chr22 42090617 1 40 42
0 chr22 42090647 0 1 chr22 42090749 1 42 42
1 chr22 42090684 0 1 chr22 42090692 1 42 42
1 chr22 42090733 0 1 chr22 42090743 1 42 42
1 chr22 42090733 0 1 chr22 42090775 1 42 42
1 chr22 42090733 0 1 chr22 42090789 1 42 42
1 chr22 42090757 0 1 chr22 42090787 1 42 24
0 chr22 42090778 0 0 chr22 42090790 1 42 42
0 chr22 42090800 0 0 chr22 42090802 1 42 42
0 chr22 42090803 0 0 chr22 42090806 1 42 42
다른 대안:
$ grep -oP '^\s*\S+\s*\K.*' file
1 chr22 42090593 0 1 chr22 42090609 1 42 42
1 chr22 42090593 0 1 chr22 42090654 1 42 42
1 chr22 42090595 0 1 chr22 42090633 1 42 42
0 chr22 42090612 0 1 chr22 42090656 1 42 42
0 chr22 42090614 0 0 chr22 42090617 1 40 42
0 chr22 42090647 0 1 chr22 42090749 1 42 42
1 chr22 42090684 0 1 chr22 42090692 1 42 42
1 chr22 42090733 0 1 chr22 42090743 1 42 42
1 chr22 42090733 0 1 chr22 42090775 1 42 42
1 chr22 42090733 0 1 chr22 42090789 1 42 42
1 chr22 42090757 0 1 chr22 42090787 1 42 24
0 chr22 42090778 0 0 chr22 42090790 1 42 42
0 chr22 42090800 0 0 chr22 42090802 1 42 42
0 chr22 42090803 0 0 chr22 42090806 1 42 42
또는
$ perl -pe 's/^\s*\S+\s*//' file
1 chr22 42090593 0 1 chr22 42090609 1 42 42
1 chr22 42090593 0 1 chr22 42090654 1 42 42
1 chr22 42090595 0 1 chr22 42090633 1 42 42
0 chr22 42090612 0 1 chr22 42090656 1 42 42
0 chr22 42090614 0 0 chr22 42090617 1 40 42
0 chr22 42090647 0 1 chr22 42090749 1 42 42
1 chr22 42090684 0 1 chr22 42090692 1 42 42
1 chr22 42090733 0 1 chr22 42090743 1 42 42
1 chr22 42090733 0 1 chr22 42090775 1 42 42
1 chr22 42090733 0 1 chr22 42090789 1 42 42
1 chr22 42090757 0 1 chr22 42090787 1 42 24
0 chr22 42090778 0 0 chr22 42090790 1 42 42
0 chr22 42090800 0 0 chr22 42090802 1 42 42
0 chr22 42090803 0 0 chr22 42090806 1 42 42
또는
$ perl -F'\t' -lane 'print join "\t",@F[1..$#F]' file
1 chr22 42090593 0 1 chr22 42090609 1 42 42
1 chr22 42090593 0 1 chr22 42090654 1 42 42
1 chr22 42090595 0 1 chr22 42090633 1 42 42
0 chr22 42090612 0 1 chr22 42090656 1 42 42
0 chr22 42090614 0 0 chr22 42090617 1 40 42
0 chr22 42090647 0 1 chr22 42090749 1 42 42
1 chr22 42090684 0 1 chr22 42090692 1 42 42
1 chr22 42090733 0 1 chr22 42090743 1 42 42
1 chr22 42090733 0 1 chr22 42090775 1 42 42
1 chr22 42090733 0 1 chr22 42090789 1 42 42
1 chr22 42090757 0 1 chr22 42090787 1 42 24
0 chr22 42090778 0 0 chr22 42090790 1 42 42
0 chr22 42090800 0 0 chr22 42090802 1 42 42
0 chr22 42090803 0 0 chr22 42090806 1 42 42
답변2
구분 기호로 공백이 있으면 다음과 같이 작동할 수 있습니다.
sed 's/^ *//' text.file | cut -f1 -d" " --complement
답변3
실제로 있다고 가정선행 공백 없음파일에서 다음 sed
기반 방법이 작동해야 합니다.
sed -r 's/^[[:digit:]]+[[:blank:]]+//' input_file
또는 더 일반적으로 (@terdon이 제안한대로)
sed -r 's/^[^[:blank:]]+[[:blank:]]+//' input_file
첫 번째 예에서는 하나 이상의 숫자를 줄 시작 부분에서 시작하는 "None"으로 바꾸고 그 뒤에 하나 이상의 공백 문자를 추가하여 나머지 부분을 변경하지 않고 줄의 해당 부분을 삭제합니다.
두 번째 예에서는 "공백이 아닌" 문자와 하나 이상의 공백 문자를 제거하므로 첫 번째 열에 텍스트(예: 머리글 행)도 포함될 수 있는 경우 더 일반적으로 적용 가능합니다.
선행 공백이 있는 경우 다음과 같이 수정합니다.
sed -r 's/^[[:blank:]]*[^[:blank:]]+[[:blank:]]+//' input_file
처음에 0개 이상의 공백을 포함하는 패턴을 제거할 수 있으므로 이 문제를 해결해야 합니다.
공백 및 탭과 일치 하므로 [[:blank:]]
탭으로 구분된 파일 형식에서도 작동해야 합니다.
일반적인 참고사항으로, 사용 시 형식 변경은 awk
일반적으로 설정 실패로 인해 발생합니다.출력 필드 구분 기호 OFS
적절한 값으로. awk
규칙의 개별 필드를 수정하면 $0
현재 값이 기본값을 사용하여 다시 생성되어 원래 행의 형식을 덮어쓰게 됩니다.OFS
SPACE
따라서 입력 파일이 TAB
구분된 경우 필드를 수정하면 출력이 공백으로 구분되어 설명하는 형식의 변경 사항을 설명하게 됩니다. 적절한 내부 변수를 설정하여 이 문제를 극복할 수 있습니다.
awk -v OFS='\t' '{귀하의 코드는 여기에 있습니다}' 입력 파일
이런 일이 발생하지 않도록 하려면 @terdon으로이미 언급됨, 단순히 필드를 빈 문자열로 설정해도 해당 필드가 제거되지 않으며 불필요한 추가 필드 구분 기호가 생깁니다.
답변4
gnu sed를 사용하여 이 작업을 수행할 수 있습니다.
$ sed -Ee 's/\S+/\n&/2;s/.*\n//' file
두 번째 필드의 시작 부분을 표시하고 그 앞의 모든 항목을 삭제합니다.
위와 같은 방법이지만 awk를 사용합니다.
awk '
BEGIN {
s = "[[:space:]]"; S = "[^[:space:]]"
F = S"+"s"*"
}
sub(s"*" F, "")+1
' file
위와 동일하지만 일치하는 기능이 있음
awk '
BEGIN {
s = "[[:space:]]"; S = "[^[:space:]]"
F = S"+"s"*"
}
match($0, F) {
$0 = substr($0, RSTART+RLENGTH)
}1
' file